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

运行结果如下:

 

目录
相关文章
|
3月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
242 77
|
3月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
148 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
3月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
101 10
|
3月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
83 9
|
3月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
132 7
|
6月前
|
算法 C++
|
2月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
11天前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
46 12
|
1月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
53 16
|
1月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。

热门文章

最新文章

下一篇
oss创建bucket