栈的存储结构的实现(C/C++实现)

简介: 存档 1 #include "iostream.h" 2 #include 3 #define max 20 4 typedef char elemtype; 5 #include "stack.

存档

 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)初始化栈s\n";
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,c\n";
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 }

运行结果如下:

 

目录
相关文章
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
49 2
|
1月前
|
算法 C++
|
1月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
3月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
34 5
|
4月前
|
存储 Prometheus Cloud Native
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
|
3月前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
35 0
|
3月前
|
关系型数据库 C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
37 0
|
5月前
|
存储 算法 程序员
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
59 4
|
5月前
|
程序员 编译器 C++
C++内存分区模型(代码区、全局区、栈区、堆区)
C++内存分区模型(代码区、全局区、栈区、堆区)