c語言——棧(受限制線性表)
概念
首先它是一個線性表,也就是說,棧元素具有線性關係,即前驅後繼關係。只不過它是
種特殊的線性表而已。定義中說是在線性表的表尾進行插入和刪除操作,這裏表尾是
指棧頂,而不是棧底。
特性
它的特殊之處在於限制了這個線性表的插入和刪除的位置,它始終只在棧頂進行。這也
就使得棧底是固定的,最先進棧的只能在棧底。
操作
棧的插入操作,叫做進棧,也成壓棧。類似子彈入彈夾
棧的刪除操作,叫做出棧,也有的叫做彈棧,退棧。如同彈夾中的子彈出夾
代碼
用數組實現棧
SeqStack.h
#pragma once
#include<stdlib.h>
#include<string.h>
#ifdef __cplusplus
extern "C"{
#endif
#define MAX 1024
//順序棧數據結構
struct SStack
{
void *data[MAX]; //存放數據的數組
int size;//棧中元素的個數
};
typedef void * SeqStack;
//數組高下標的位置當做棧頂,因爲不需要移動數組中的元素在插入和刪除中
//初始化
SeqStack Init_SeqStack();
//入棧
void Push_SeqStack(SeqStack stack, void *data);
//出棧
void Pop_SeqStack(SeqStack stack);
//獲得棧頂元素
void *Top_SeqStack(SeqStack stack);
//獲得棧的大小
int Size_SeqStack(SeqStack stack);
//銷燬棧
void Destroy_SeqStack(SeqStack stack);
#ifdef __cplusplus
}
#endif
SeqStack.c
#include"SeqStack.h"
//初始化
SeqStack Init_SeqStack()
{
struct SStack *stack = malloc(sizeof(struct SStack));
if (NULL == stack)
{
return NULL;
}
//memset(stack->data, 0, sizeof(struct SStack));
stack->size = 0;
for (int i = 0; i < MAX; ++i)
{
stack->data[i] = NULL;
}
return stack;
}
//入棧
void Push_SeqStack(SeqStack stack, void *data)
{
if (NULL == stack)
{
return;
}
if (NULL == data)
{
return;
}
struct SStack *s = (struct SStack *)stack;
if (s->size == MAX)
{
return;
}
s->data[s->size] = data;
s->size++;
}
//出棧
void Pop_SeqStack(SeqStack stack)
{
if (NULL == stack)
{
return;
}
struct SStack *s = (struct SStack *)stack;
if (s->size == 0)
{
return;
}
s->data[s->size - 1] = NULL;
s->size--;
}
//獲得棧頂元素
void *Top_SeqStack(SeqStack stack)
{
if (NULL == stack)
{
return NULL;
}
struct SStack *s = (struct SStack *)stack;
if (s->size == 0)
{
return NULL;
}
return s->data[s->size - 1];
}
//獲得棧的大小
int Size_SeqStack(SeqStack stack)
{
if (NULL == stack)
{
return -1;
}
struct SStack *s = (struct SStack *)stack;
return s->size;
}
//銷燬棧
void Destroy_SeqStack(SeqStack stack)
{
if (NULL == stack)
{
return;
}
free(stack);
}
測試
棧的順序存儲
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"SeqStack.h"
struct Person
{
char name[64];
int age;
};
void test()
{
//初始化棧
SeqStack stack = Init_SeqStack();
//創建數據
struct Person p1 = { "aaa", 10 };
struct Person p2 = { "bbb", 20 };
struct Person p3 = { "ccc", 30 };
struct Person p4 = { "ddd", 40 };
struct Person p5 = { "eee", 50 };
struct Person p6 = { "fff", 60 };
//數據入棧
Push_SeqStack(stack, &p1);
Push_SeqStack(stack, &p2);
Push_SeqStack(stack, &p3);
Push_SeqStack(stack, &p4);
Push_SeqStack(stack, &p5);
Push_SeqStack(stack, &p6);
//輸出棧中所有元素
while (Size_SeqStack(stack) > 0)
{
//獲得棧頂元素
struct Person *person = (struct Person *)Top_SeqStack(stack);
//打印
printf("Name:%s Age:%d\n",person->name,person->age);
//彈出棧頂元素
Pop_SeqStack(stack);
}
printf("Size:%d\n", Size_SeqStack(stack));
//銷燬棧
Destroy_SeqStack(stack);
stack = NULL;
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
思考,void *data[MAX];
爲什麼不用free
。