栈的存储结构的实现(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++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
49 10
|
1月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
38 7
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
44 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
46 9
|
4月前
|
算法 C++
|
1天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
1天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
4天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)