C++栈的基本操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++栈的基本操作
1// zhan.cpp : 定义控制台应⽤程序的⼊⼝点。

2//
3
4 #include "stdafx.h"
5 #include <iostream>
6using namespace std;
7 typedef struct stacknode
8 {
9int data;
10struct stacknode *next;
11 }stacknode,*LinkStack;
12
13//判断栈为空
14int StackEmpty(LinkStack &top)
15 {
16if(top ->next == NULL)
17return1;
18else
19return0;
20 }
21
22//⼊栈函数
23 LinkStack push(LinkStack &top,int value)
24 {
25 LinkStack p = new stacknode;
26if(p != NULL)
27 {
28 p ->data = value;//可以理解为在链表尾部插⼊⼀个节点。

29 p ->next = top ->next;
30 top ->next = p;
31 }
32else
33 cout << "没有内存可分配" << endl;
34return top;
35 }
36
37//出栈函数
38int pop(LinkStack &top)
39 {
40 LinkStack temp = new stacknode;
41int data;
42if(StackEmpty(top))
43 cout << "该栈为空!" << endl;
44else
45 {
46 temp = top ->next;//可以理解为删除⼀个节点
47 data = temp ->data;
48 top ->next = temp ->next;
49 delete(temp);
50 }
51return data;
52 }
53
54//打印函数
55void Print(LinkStack &top)
56 {
57 LinkStack top1 = top; //时刻要注意,我们不可以改变链表本⾝的值及指向,不过我们可以找别⼈来完成此事。

58if(top1 ->next == NULL)
59 cout << "该栈为空!"<< endl;
60else
61 {
62while(top1 ->next != NULL)
63 {
64 cout << top1->next ->data<< "";//top本⾝data为0,此为不带头节点的链表
65 top1 = top1 ->next;
66 }
67 }
68 }
69
70//取栈顶元素
71int StackTop(LinkStack &top)
72 {
73 LinkStack p = top;
74if(StackEmpty(p))
75 cout << "该栈为空!" << endl;
76else
77 {
78return p ->next ->data;
81 }
82
83//获得栈的长度
84int StackLength(LinkStack &top)
85 {
86int length = 0;
87 LinkStack q = top;
88while(q ->next != NULL)
89 {
90 length ++;
91 q = q ->next;
92 }
93return length;
94 }
95
96//销毁栈
97void DestroyStack(LinkStack &top)
98 {
99 LinkStack p;
100while(top)
101 {
102 p = top ->next;//保存top的下⼀个位置。

103 delete top;
104 top = p;
105 }
106 cout << "销毁成功!" << endl;
107 }
108
109//栈的初始化
110void InitStack(LinkStack &top)
111 {
112 top = new stacknode;
113 top ->next = NULL;
114 }
115
116//前导函数
117void printscreen(void)
118 {
119 cout<<"0------退出程序"<<endl
120 <<"1------⼊栈操作"<<endl
121 <<"2------出栈操作"<<endl
122 <<"3------取栈顶元素"<<endl
123 <<"4------判断栈是否为空"<<endl
124 <<"5------返回栈的元素个数"<<endl
125 <<"6------初始化栈"<<endl
126 <<"7------显⽰栈"<<endl
127 <<"8------销毁栈"<<endl
128 <<"9------退出程序"<<endl;
129 }
130
131
132int main()
133 {
134 LinkStack top = NULL;
135 InitStack(top);
136 printscreen();
137int n,value;
138 cin >> n;
139while(n) //输⼊0也可以退出循环
140 {
141switch(n)
142 {
143case1 : //⼊栈操作
144 cout << "请输⼊⼀个整数" <<endl;
145 cin >> value;
146while(value!=0) //以0作为结束条件
147 {
148 push(top,value);
149 cin >> value;
150 }
151 Print(top); //打印栈
152 cout << endl;
153break;
154case2: //出栈操作
155if(top ->next != NULL)
156 cout << "弹出的元素是:"<< pop(top) << endl; 157break;
158case3: //取栈顶元素
159 cout << StackTop(top) << endl;
160break;
161case4: //判断栈是否为空
165 cout << "该栈不为空!" << endl;
166break;
167case5: //返回栈的元素个数
168if(StackEmpty(top) == 0)
169 cout << StackLength(top)<<endl;
170break;
171case6: //初始化栈
172 InitStack(top);
173 cout << endl;
174break;
175case7://显⽰栈
176 Print(top); //打印栈
177 cout << endl;
178break;
179case8: //销毁栈
180 DestroyStack(top);
181 cout << endl;
182break;
183case9:
184goto end;
185default:
186 cout << "不合法的输⼊,请重新输⼊"<< endl;
187 }
188 printscreen();
189 cin >> n;
190 }
191 end: ;
192return0;
193 }
实验⼆
实验名称:栈的基本操作
实验⽬的:掌握栈的结构特点并熟悉栈的基本操作。

实验要求:编程实现顺序栈的各种基本运算,并在此基础上设计⼀个主程序完成如下功能:
1、采⽤链式存储实现栈的初始化、判空、⼊栈、出栈操作。

实验步骤及内容:
1、⾸先建⽴⼀个定义多项式的结构体stacknode,及结构体指针LinkStack,该结构体包含⼀个数据域data,⼀个指向下⼀项的指针*next,代码如下:
typedef struct stacknode
{
int data;
struct stacknode *next;
}stacknode,*LinkStack;
2、栈的初始化,代码如下:
//栈的初始化
void InitStack(LinkStack &top)
{
top = new stacknode;
top ->next = NULL;
}
3、⼊栈,⾸先开辟内存空间,并将新开辟的结点插⼊在此栈的后⾯。

具体的代码如下:
//⼊栈函数
{
LinkStack p = new stacknode;
if(p != NULL)
{
p ->data = value;//可以理解为在链表尾部插⼊⼀个节点。

p ->next = top ->next;
top ->next = p;
}
else
cout << "没有内存可分配" << endl;
return top;
}
5、出栈,从栈中删除⼀个结点。

⾸先我们必须开辟⼀个结点⽤来存储top结点的下⼀个结点,然后将top->next 执⾏下下⼀个结点,这样就删除了⼀个结点。

int pop(LinkStack &top)
{
LinkStack temp = new stacknode;
int data;
if(StackEmpty(top))
cout << "该栈为空!" << endl;
else
{
temp = top ->next;//可以理解为删除⼀个节点
data = temp ->data;
top ->next = temp ->next;
delete(temp);
}
return data;
}
6、打印栈,此函数⽤来对栈进⾏输出验证。

//打印函数
void Print(LinkStack &top)
{
LinkStack top1 = top; //时刻要注意,我们不可以改变链表本⾝的值及指向,不过我们可以找别⼈来完成此事。

if(top1 ->next == NULL)
cout << "该栈为空!"<< endl;
else
while(top1 ->next != NULL)
{
cout << top1->next ->data<< " ";//top本⾝data为,此为不带头节点的链表
top1 = top1 ->next;
}
}
}
7、去栈顶元素,如果不为空则取出栈顶元素。

//取栈顶元素
int StackTop(LinkStack &top)
{
LinkStack p = top;
if(StackEmpty(p))
cout << "该栈为空!" << endl;
else
{
return p ->next ->data;
}
}
8、获取栈的长度,必须临时开辟⼀个新的结构体指针,作为top的副本,这样就不会破坏top本⾝的结构了,⽽且对于top的副本,我们也不能对其空间进⾏释放,不然top的最后⼀个next不会为NULL,⽽是⼀个不确定的值,这样对以后的操作造成破坏。

//获得栈的长度
int StackLength(LinkStack &top)
{
int length = 0;
LinkStack q = top;
while(q ->next != NULL)
{
length ++;
q = q ->next;
}
return length;
}
9、销毁栈,就是从栈顶开始⼀个节点⼀个节点的释放。

//销毁栈
void DestroyStack(LinkStack &top)
LinkStack p;
while(top)
{
p = top ->next;//保存top的下⼀个位置。

delete top;
top = p;
}
cout << "销毁成功!" << endl;
}
链表可以往后插,也可以往前插。

如果我们⽤每次往后⽤p - > next = NULL;叫做往后插。

相关文档
最新文档