码迷,mamicode.com
首页 > 其他好文 > 详细

栈的链式存储结构和入栈出栈操作

时间:2016-04-18 23:57:39      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

参考《大话数据结构》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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!