一、栈的基本概念
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
二、顺序栈的结构
我们先来看看栈的实现

三、栈的基本实现
1、数据结构
typedef char StackType;
7 typedef struct SeqStack{
8 StackType* data;//使内存可以动态管理
9 int size;//栈元素的有效个数
10 int capacity;//栈默认的空间,data这段内存上所能容纳的元素的个数
11 }SeqStack;
12
2、顺序表初始化
3 void SeqStackInit(SeqStack* stack){
4 if(stack==NULL){
5 return;
6 }
7 stack->size=0;
8 stack->capacity=1000;
9 stack->data=(StackType*)malloc(stack->capacity*sizeof(StackType));
10 }
3、栈的销毁
void SeqStackDestroy(SeqStack* stack)//销毁函数
13 {
14 if(stack==NULL){
15 return;
16 }
17 free(stack->data);
18 stack->size=0;
19 stack->capacity=0;
20 }
4、打印函数
void SeqStackPrint(SeqStack* stack,const char* msg)//打印函数
23 {
24 printf("[ %s ]\n",msg);
25 if(stack==NULL){
26 return ;
27 }
28 int i=0;
29 for(i=0;i<stack->size;i++){
30 printf("[%c] ",stack->data[i]);
31 }
32 printf("\n");
33 }
5、扩容
扩容时,我们扩容的策略由自己设置,在这里用原大小的*2+1,原因由于STL扩容原则为*2,+1是为了避免原大小为1的可能性。扩容完毕之后,我们需要将我们以前的数据搬运过来,并且需要释放掉原来那些不用的内存,以防发生内存泄露。
void SeqStackResize(SeqStack* stack)//扩容
36 {
37 if(stack==NULL){
38 return;
39 }
40 if((stack->size)<(stack->capacity)){
41 return;
42 }
43 stack->capacity=stack->capacity*2+1;
44 StackType* new=(StackType*)malloc(stack->capacity*sizeof(StackType));
45 int i=0;
46 for(i=0;i<stack->size;i++){
47 new[i]=stack->data[i];
48 }
49 free(stack->data);
50 stack->data=new;
51
52 }
6、入栈
54 void SeqStackPush(SeqStack* stack,StackType value)//入栈
55 {
56 if(stack==NULL){
57 return;
58 }
59 if((stack->size)>=(stack->capacity)){
60 SeqStackResize(stack);
61 }
62 stack->data[stack->size++]=value;
63 }
7、出栈操作
void SeqStackPop(SeqStack* stack)//出栈
66 {
67 if(stack==NULL){
68 return;
69 }
70 if(stack->size==0){
71 return ;
72 }//空栈
73 --stack->size;
74 }
8、取栈顶元素
` int SeqStackTop(SeqStack* stack,StackType *value)//取栈顶元素
77 {
78
79 if(stack==NULL){
80 return ;
81 }
82 if(stack->size==0){
83 return ;//空栈
84 }
85 *value=stack->data[stack->size-1];
86 return *value;
87 }
88
89
9、进行测试函数的实现
///////////////////////////////////////////////////////////
///////////////////////test.c///////////////////////////////
///////////////////////////////////////////////////////////
#define TEST_HEADER printf("\n=================%s=============\n",__FUNCTION__);
void test1(){
SeqStack stack;
SeqStackInit(&stack);
}
void test2(){
SeqStack stack;
SeqStackInit (&stack);
SeqStackPush(&stack,'a');
SeqStackPush(&stack,'b');
SeqStackPush(&stack,'c');
SeqStackPush(&stack,'d');
SeqStackPush(&stack,'e');
SeqStackPrint(&stack,"入栈五个元素");
}
void test3(){
SeqStack stack;
SeqStackInit (&stack);
SeqStackPush(&stack,'a');
SeqStackPush(&stack,'b');
SeqStackPush(&stack,'c');
SeqStackPush(&stack,'d');
SeqStackPush(&stack,'e');
SeqStackPrint(&stack,"入栈五个元素");
SeqStackPop(&stack);
SeqStackPrint(&stack,"出栈一个元素");
}
void test4(){
SeqStack stack;
SeqStackInit (&stack);
SeqStackPush(&stack,'a');
SeqStackPush(&stack,'b');
SeqStackPush(&stack,'c');
SeqStackPush(&stack,'d');
// SeqStackPush(&stack,'e');
SeqStackPrint(&stack,"入栈五个元素");
StackType value;
int ret= SeqStackTop(&stack,&value);
printf("expected ret = %c, actual ret = %c\n", value);
printf("expected value = %c, actual value = %c\n", ret);
}
int main(){
// test1();
// test2();
test3();
test4();
return 0;
}
`
本文深入讲解了栈这一数据结构的概念及其实现方式,包括栈的基本操作如入栈、出栈等,并通过具体代码示例展示了如何使用顺序表来实现栈。
482

被折叠的 条评论
为什么被折叠?



