数据结构实验五 栈和队列

简介: 数据结构实验五 栈和队列

一、实验目的

1. 掌握栈的顺序表示和实现;

二、实验原理

1.栈是限定仅在表尾进行插入或删除的线性表,又称为先进后出的线性表。栈有两种存储表示,顺序表示(顺序栈)和链式表示(链栈)。栈的主要操作是进栈和出栈,对于顺序栈的进栈和出栈操作要注意判断栈满或栈空。

三、实验内容及步骤

(一)实验内容

1.编写一个程序实现顺序栈的各种基本运算。

(二)实验步骤

1. 初始化顺序栈

2. 插入元素

3. 删除栈顶元素

4. 取栈顶元素

5. 遍历顺序栈

6. 置空顺序栈

1. #include<iostream>
2. #include<fstream>
3. using namespace std;
4. 
5. //顺序栈定义
6. #define OK 1
7. #define ERROR 0
8. #define OVERFLOW -2
9. #define MAXSIZE  100//顺序栈存储空间的初始分配量
10. typedef int Status;
11. typedef char SElemType;
12. 
13. typedef struct {
14.   SElemType *base;//栈底指针
15.   SElemType *top;//栈顶指针
16.   int stacksize;//栈可用的最大容量
17. } SqStack;
18. 
19. //算法3.1 顺序栈的初始化
20. Status InitStack(SqStack &S) {
21.   S.base=new SElemType[MAXSIZE];
22.   if(!S.base) exit(OVERFLOW);
23.   S.top=S.base;
24.   S.stacksize=MAXSIZE;
25.   return OK; 
26. }
27. //算法3.2 顺序栈的入栈
28. Status Push(SqStack &S, SElemType e) {
29.   if(S.top-S.base==S.stacksize)return ERROR;
30.   *S.top++=e;
31.   return OK; 
32. }
33. //算法3.3 顺序栈的出栈
34. Status Pop(SqStack &S, SElemType &e) {
35.   if(S.top==S.base) return ERROR;
36.   e=*--S.top;
37.   return OK; 
38. }
39. //算法3.4 取顺序栈的栈顶元素
40. char GetTop(SqStack S) {//返回S的栈顶元素,不修改栈顶指针
41.   if (S.top != S.base) //栈非空
42.     return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变
43. }
44. 
45. int main() {
46.   SqStack s;
47.   int choose, flag = 0;
48.   SElemType j, e, t;
49.   cout << "1.初始化\n";
50.   cout << "2.入栈\n";
51.   cout << "3.读栈顶元素\n";
52.   cout << "4.出栈\n";
53.   cout << "0.退出\n\n";
54. 
55.   choose = -1;
56.   while (choose != 0) {
57.     cout << "请选择:";
58.     cin >> choose;
59.     switch (choose) {
60.     case 1://算法3.1 顺序栈的初始化
61.       if (InitStack(s)) {
62.         flag = 1;
63.         cout << "成功对栈进行初始化\n\n";
64.       } else
65.         cout << "初始化栈失败\n\n";
66.       break;
67.     case 2: {//算法3.2 顺序栈的入栈
68.       fstream file;
69.       file.open("SqStack.txt");
70.       if (!file) {
71.         cout << "错误!未找到文件!\n\n" << endl;
72.         exit(ERROR);
73.       }
74.       if (flag) {
75.         flag = 1;
76.         cout << "进栈元素依次为:\n";
77.         while (!file.eof()) {
78.           file >> j;
79.           if (file.fail())
80.             break;
81.           else {
82.             Push(s, j);
83.             cout << j << "  ";
84.           }
85.         }
86.         cout << endl << endl;
87.       } else
88.         cout << "栈未建立,请重新选择\n\n";
89.       file.close();
90.     }
91.       break;
92.     case 3://算法3.3 顺序栈的出栈
93.       if(flag != -1 && flag != 0)
94.         cout << "栈顶元素为:\n" << GetTop(s) << endl << endl;
95.       else
96.         cout << "栈中无元素,请重新选择\n" << endl;
97.       break;
98.     case 4://算法3.4 取顺序栈的栈顶元素
99.       cout << "依次弹出的栈顶元素为:\n";
100.      while (Pop(s, t)){
101.        flag = -1;
102.        cout << t << "  ";
103.      }
104.      cout << endl << endl;
105.      break;
106.    }
107.  }
108.  return 0;
109. }
目录
相关文章
|
4天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
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
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
72 0
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
55 1
|
3月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
116 21
|
3月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。

热门文章

最新文章