标签:
参考《大话数据结构》P98~99——栈的链式存储结构。
进栈:
出栈:
举个简单的例子:
代码和解释如下(VS2012测试通过):
1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便
6
7 //栈的结点
8 //包含data,和指向下一个结点的指针next
9 typedef struct StackNode
10 {
11 char data;
12 struct StackNode *next;
13 }StackNode;
14
15 //栈的链式存储结构
16 //包含指向栈顶的指针top,和栈中元素个数count
17 //top指向最新入栈的结点,出栈的时候也是top指向的元素先出
18 typedef struct LinkStack
19 {
20 StackNode *top;
21 int count;
22 }LinkStack;
23
24 //申请内存,初始化
25 //top指向NULL,表示初始化为空栈
26 LinkStack *InitLinkStack(LinkStack *s)
27 {
28 s=new LinkStack;
29 s->top=NULL;
30 s->count=0;
31 return s;
32 }
33
34 //入栈
35 status Push(LinkStack *s,char e)
36 {
37 StackNode *sn=new StackNode;//申请一个结点空间,定义并初始化指向该结点的指针sn
38 sn->data=e;//把入栈的元素赋值给新结点的data
39 sn->next=s->top;//把新结点的next指向上一个结点
40 s->top=sn;//把top指针指向新结点,栈顶元素是新入栈的元素
41 s->count++;//栈的元素个数加1
42 return "push ok";//返回入栈成功
43 }
44
45 //出栈
46 status Pop(LinkStack *s,char *e)
47 {
48 StackNode *p;//定义一个临时结点指针
49 if(s->top==NULL)
50 return "pop error";//如果是空栈,直接返回出栈失败
51 p=s->top;//把栈顶指针赋值给临时指针p
52 *e=p->data;//把栈顶元素赋值给e指向的变量,即主调函数中需要被修改的变量
53 if(p->next==NULL)//如果出栈的是最后一个元素
54 s->top=NULL;//该元素出栈后,栈为空
55 else
56 s->top=s->top->next;//否则top指向出栈结点的下一个结点
57 //这个if else也可以直接写成s->top=s->top->next;因为如果出栈的是最后一个元素,top->next本来就等于NULL
58 free(p);//释放临时指针p指向的空间
59 s->count--;//栈的元素减1
60 return "pop ok";//返回出栈成功
61 }
62
63 int main()
64 {
65 LinkStack *p=NULL;
66 p=InitLinkStack(p);
67
68 //入栈
69 cout<<"A"<<" "<<Push(p,‘A‘)<<" ";//入栈A
70 cout<<p->count<<endl;//入栈A后有1个元素
71 cout<<"B"<<" "<<Push(p,‘B‘)<<" ";//入栈B
72 cout<<p->count<<endl;//入栈B后有2个元素
73
74 //出栈
75 char e;
76 char *pe=&e;
77 cout<<Pop(p,pe)<<" ";//出栈B
78 cout<<e<<" "<<p->count<<endl;//出栈B后有1个元素
79 cout<<Pop(p,pe)<<" ";
80 cout<<e<<" "<<p->count<<endl;//出栈A后有0个元素
81 cout<<Pop(p,pe)<<endl;//栈空,出栈失败
82 }
运行结果:
对比顺序栈和链栈:
时间上:
它们入栈和出栈在时间复杂度上是一样的,均是O(1)。
空间上:
顺序栈需要实现确定一个固定的长度,可能会存在内存空间浪费的问题。但存取时定位很方便。
链栈要求每个元素都有指针域,增加了内存开销,但对于栈的长度无限制。
所以如果栈的使用过程中元素变化不可预料,最好是用链栈。反之,如果它的变化在可控范围内,建议用顺序栈。
标签:
原文地址:http://www.cnblogs.com/hslzju/p/5406158.html