栈:一种只允许在一端进行插入和删除的线性表。向栈中插入元素叫进栈,从栈中删除数据元素叫出栈。
栈有顺序存储和链式存储,顺序存储需要事先分配栈的内存空间,这里只讲链式存储。
国际惯例,先上源代码,再说各个模块。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<malloc.h> 4 5 //栈的定义 6 typedef struct node{ 7 int data; 8 struct node *next; 9 }Stack; 10 11 //栈的初始化 12 void StackInit(Stack *top) 13 { 14 //将栈顶指针置为空 15 top->next=NULL; 16 } 17 18 //判断栈是否为空:为空返回1,不为空返回0 19 int IsEmpty(Stack *top) 20 { 21 //栈顶是否为空,栈顶为空即栈为空 22 if(top->next==NULL) 23 { 24 return 1; 25 } 26 return 0; 27 } 28 29 //进栈:将元素element压入栈中。成功返回1,失败返回0 30 int Push(Stack *top,int element) 31 { 32 //创建新的节点,存放元素element 33 Stack *p; 34 p=(Stack*)malloc(sizeof(Stack)); 35 if(p==NULL) 36 { 37 return 0; 38 } 39 p->data=element; 40 //入栈时栈顶不变,新的节点放入栈顶下面.即栈顶指针后移 41 p->next=top->next; 42 top->next=p; 43 return 1; 44 } 45 46 //出栈:出栈的数据元素给element 47 int Pop(Stack *top,int *element) 48 { 49 if(IsEmpty(top)) 50 { 51 return 0; 52 } 53 Stack *p; 54 p=top->next;//栈顶下面第一个节点,即是要出栈的 55 *element=p->data; 56 top->next=p->next;//栈顶前移 57 free(p);//释放内存空间 58 return 1; 59 } 60 61 int main() 62 { 63 int x; 64 Stack *top=(Stack*)malloc(sizeof(Stack));//栈顶 65 StackInit(top);//栈初始化 66 printf("input some positive integers:\n"); 67 scanf("%d",&x); 68 while(x>0) 69 { 70 Push(top,x);//进栈 71 scanf("%d",&x); 72 } 73 Stack *p=top; 74 //输出栈中元素(从栈顶开始) 75 printf("elemet in stack:\n"); 76 while(p) 77 { 78 printf("%d ",p->data); 79 p=p->next; 80 } 81 p=NULL; 82 printf("\n"); 83 //出栈,输出出栈元素 84 printf("Pop stack element:\n"); 85 while(Pop(top,&x)) 86 { 87 printf("%d ",x); 88 } 89 printf("\n"); 90 //注:出栈时已经释放掉了栈中的内存空间 91 free(top); 92 93 return 0; 94 }
栈是一种单链表,但跟单链表不同的是,对栈的操作只需要栈顶即可,即不需要访问栈中其他位置。
1.栈的初始化:将栈顶指针置为NULL
2.判断栈是否为空:查看栈顶指针是否为空,而不是查看栈顶是否为空。
3.进栈:进栈时栈顶指针后移,怎么理解呢?就是栈顶不变,将要入栈的节点放在栈顶下面,即栈顶指针只想入栈的节点,每次进栈时都放在栈的最上面。
4.出栈:栈顶指针前移。就是将栈顶下面的节点删除掉,每次出栈都将栈最上面的节点删除掉。
注:出栈时要将出栈的那块内存空间释放掉,最后,将栈清空后,还要将栈顶的内存空间也释放掉。