栈的存储结构的实现(C/C++实现)
时间:2022-05-07
本文章向大家介绍栈的存储结构的实现(C/C++实现),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
存档
1 #include "iostream.h"
2 #include <stdlib.h>
3 #define max 20
4 typedef char elemtype;
5 #include "stack.h"
6 void main()
7 {
8 stack s;
9 char x;
10 cout<<"(1)初始化栈sn";
11 initstack(s);
12 cout<<"(2)栈为"<<(stackempty(s)?"空":"非空")<<endl;
13 cout<<"(3)依次输入字母序列,以'#'结束"<<endl;
14 cin>>x;
15 while(x!='#')
16 {
17 push(s,x);
18 cin>>x;
19 }
20 cout<<"(4)栈为"<<(stackempty(s)?"空":"非空")<<endl;
21 cout<<"(5)栈长度stacklength(s):"<<stacklength(s)<<endl;
22 cout<<"(6a)栈顶元素gettop(s)为:"<<gettop(s)<<endl;
23 cout<<"(6b)栈顶元素gettop1(s,x)为:";
24 gettop1(s,x);
25 cout<<x<<endl;
26 cout<<"(7)从栈顶到栈底元素printstack(s):";
27 printstack(s);
28 cout<<"(8)出栈pop1(s,x)的元素为:";
29 pop1(s,x);
30 cout<<x<<endl;
31 cout<<"(9)出栈序列:";
32 while(!stackempty(s))
33 {
34 cout<<pop(s)<<" ";
35 }
36 cout<<endl;
37 cout<<"(10)栈为"<<(stackempty(s)?"空":"非空")<<endl;
38 cout<<"(11)依次进栈元素a,b,cn";
39 push(s,'a');
40 push(s,'b');
41 push(s,'c');
42 cout<<"(12)从栈顶到栈底元素printstack(s):";
43 printstack(s);
44 cout<<"(13)清空栈clearstack(s)n";
45 clearstack(s);
46 cout<<"(14)栈为"<<(stackempty(s)?"空":"非空")<<endl;
47 cout<<"(15)销毁栈"<<endl;
48 destorystack(s);
49 cout<<"(17)销毁栈后调用push(s,e)和printstack(s)"<<endl;
50 push(s,'e');
51 printstack(s);
52 }
1 struct stack
2 {
3 elemtype *base;//存栈元素
4 elemtype *top;//栈顶指定器
5 int stacksize;//栈的最大容量
6 };
7 void initstack(stack &s)
8 {
9 //构造一个空栈s
10 s.base=new elemtype[max];//malloc()分配存储空间
11 if(!s.base)
12 exit(-2);//#define OVERFLOW -2
13 s.top=s.base;//空栈
14 s.stacksize=max;//栈的存储容量
15 }
16 void clearstack(stack &s)
17 {
18 //清除栈s,使成为空栈
19 s.top=s.base;//空栈栈顶指针和栈底指针相等
20 }
21 int stackempty(stack s)
22 {
23 //若栈s为空栈返回1,否则返回0
24 if(s.top==s.base)
25 return 1;//空栈返回1,非空返回0
26 else
27 return 0;
28 }
29 int stacklength(stack s)
30 {
31 //返回栈的长度
32 return s.top-s.base;
33 }
34 void push(stack &s,elemtype e)
35 {
36 //元素e进栈
37 if(!s.base)//栈不存在的处理
38 {
39 cout<<"栈不存在n";
40 return;
41 }
42 if(s.top-s.base>s.stacksize)//栈满的处理
43 {
44 cout<<"栈已满!n";
45 return;
46 }
47 *s.top=e;//元素e存进栈顶的位置
48 s.top++;//栈顶指针指向栈顶元素的下一个位置
49 }
50 elemtype pop(stack &s)
51 {
52 //栈s的栈顶元素出栈并返回
53 if(s.base==s.top)
54 {
55 cout<<"栈空,不能出栈n";
56 exit(-2);
57 }
58 else
59 {
60 s.top--;//栈顶指针减1,下次进栈,会覆盖当前位置的值,相当于删除
61 return *s.top;//返回栈顶元素的值
62 }
63 }
64 int pop1(stack &s,elemtype &e)
65 {
66 //栈s的栈顶元素出栈并返回
67 if(s.base==s.top)
68 {
69 cout<<"栈空,不能出栈n";
70 return 0;
71 }
72 else
73 {
74 s.top--;//栈顶指针减1,下次进栈,会覆盖当前位置的值,相当于删除
75 e=*s.top;
76 return 1;//返回栈顶元素的值
77 }
78 }
79 elemtype gettop(stack s)
80 {
81 //取栈s的当前栈顶元素并返回
82 if(s.top==s.base)
83 {
84 cout<<"栈空,获取栈顶元素失败"<<endl;
85 exit(-2);
86 }
87 else
88 return *(s.top-1);//top指针-1的位置才是栈顶元素所在的位置
89 }
90 int gettop1(stack s,elemtype &e)
91 {
92 //取栈s的当前栈顶元素并返回
93 if(s.top==s.base)
94 {
95 cout<<"栈空,获取栈顶元素失败"<<endl;
96 return 0;
97 }
98 else
99 e=*(s.top-1);
100 return 1;//top指针-1的位置才是栈顶元素所在的位置
101 }
102 void printstack(stack s)
103 {
104 //输出栈中所有元素,但不出栈,不做任何修改
105 int i;
106 for(i=s.top-s.base-1;i>=0;i--)//总共s.top-s.base个元素,下标范围就是[0...(s.top-s.base-1)]
107 cout<<s.base[i]<<" ";
108 cout<<endl;
109 }
110 void destorystack(stack &s)
111 {
112 //销毁栈
113 delete s.base;//销毁连续空间
114 s.base=NULL;//指针赋空
115 s.top=NULL;//指针赋空
116 s.stacksize=0;//栈容量赋0
117 }
运行结果如下:
- C++判断char*的指向
- Linux基础(day18)
- Spring Boot搭建Web应用
- 5.7 vim实践
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
- 2.3 ls命令
- Effective Modern C++翻译(6)-条款5:auto比显示的类型声明要更好
- 大白话-prototype属性
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
- Effective Modern C++翻译(4)-条款3:了解decltype
- 大白话-constructor
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
- React Native在Android平台运行gif的解决方法
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法