栈的存储结构的实现(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 }

运行结果如下:

 

目录
相关文章
|
1月前
|
C语言 C++
C/C++ 自定义头文件,及头文件结构详解
还是从"stdio.h"说起,这是C语言中内置的标准库,也就是说,头文件很多时候其实就是一个“库”,类似于代码的仓库,也就是说将某些具有特定功能的常量、宏、函数等归为一个大类,然后放进这个“仓库”,就像stdio.h就是一个标准输入/输出的头文件
32 1
|
1月前
|
设计模式 算法 C++
【C++初阶】12. Stack(栈)和Queue(队列)
【C++初阶】12. Stack(栈)和Queue(队列)
43 3
|
3天前
|
存储 设计模式 C语言
C++中的栈和队列
C++中的栈和队列
7 0
|
6天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
10 0
|
6天前
|
存储 算法 数据安全/隐私保护
【C++入门到精通】 哈希结构 | 哈希冲突 | 哈希函数 | 闭散列 | 开散列 [ C++入门 ]
【C++入门到精通】 哈希结构 | 哈希冲突 | 哈希函数 | 闭散列 | 开散列 [ C++入门 ]
7 0
|
20天前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
20天前
|
设计模式 C语言 C++
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理
【C++进阶(六)】STL大法--栈和队列深度剖析&优先级队列&适配器原理
|
1月前
|
程序员 C语言 C++
C++流程结构
C++流程结构
|
1月前
|
存储 C++
C++ 栈和堆的作用机制,及特点区别
在介绍C++中的十分重要的动态内存管理机制之前,有必要先单独来介绍一下C++中的两个概念,分别是栈和堆。
19 2
|
1月前
|
存储 C语言 C++
C++栈区、堆区、全局静态区、代码区的介绍
C++栈区、堆区、全局静态区、代码区的介绍