Romi-知行合一

轻轻的风轻轻的梦,轻轻的晨晨昏昏, 淡淡的云淡淡的泪,淡淡的年年岁岁。
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

数据结构学习4——栈

Posted on 2012-08-28 15:47  romi  阅读(773)  评论(0编辑  收藏  举报

栈:一种只允许在一端进行插入和删除的线性表。向栈中插入元素叫进栈,从栈中删除数据元素叫出栈。

栈有顺序存储和链式存储,顺序存储需要事先分配栈的内存空间,这里只讲链式存储。

国际惯例,先上源代码,再说各个模块。

 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.出栈:栈顶指针前移。就是将栈顶下面的节点删除掉,每次出栈都将栈最上面的节点删除掉。

注:出栈时要将出栈的那块内存空间释放掉,最后,将栈清空后,还要将栈顶的内存空间也释放掉。