实验3:栈、队列与递归
集美大学课程实验报告-实验3:栈、队列与递归
| 项目名称 | 内容 |
|---|---|
| 课程名称 | 数据结构 |
| 班级 | 网安XXX |
| 指导教师 | 郑如滨 |
| 学生姓名 | 王鑫杰 |
| 学号 | 202421336047 |
| 实验项目名称 | 栈、队列与递归 |
| 上机实践日期 | 2025/3/30 |
| 上机实践时间 | 2学时 |
一、目的(本次实验所涉及并要求掌握的知识点)
以下内容请根据实际情况编写
- 掌握数据结构的基本概念和应用。
- 学习相关算法的实现与优化。
- 理解数据结构在实际问题中的应用。
二、实验内容与设计思想
题目一:栈与队列-stack、queue与string小综合
题目相关伪代码
int main()
{
string line;
char m, x;
stack<char>s1, s2;
queue<char>q1;
//将字符串以及要删除的字符录入line和x中;
//循环将line录入的字符推入s1和s2栈中;
//输出总字符长度以及最后一个入栈的字符;
while (!s1.empty())
{
cout << s1.top();
s1.pop();
}
cout << endl;
//判断是否是要删除的字符,如果是就不入队列,如果不是就入队列;
cout << q1.size() << " " << q1.front() << " " << q1.back() << endl;
while (!q1.empty())
{
cout << q1.front();;
q1.pop();
}
return 0;
}
函数代码
#include <iostream>
#include <stack>
#include <queue>
#include <string>
using namespace std;
int main()
{
string line;
char m, x;
stack<char>s1, s2;
queue<char>q1;
cin >> line >> x;
for (size_t i = 0; i < line.size(); i++)
{
s1.push(line[i]);
s2.push(line[i]);
}
m = s1.top();
cout << s1.size() << " " << m << endl;
while (!s1.empty())
{
cout << s1.top();
s1.pop();
}
cout << endl;
for (size_t i = s2.size(); i > 0; i--)
{
if(s2.top() != x)
{
q1.push(s2.top());
}
s2.pop();
}
cout << q1.size() << " " << q1.front() << " " << q1.back() << endl;
while (!q1.empty())
{
cout << q1.front();;
q1.pop();
}
return 0;
}
题目二:数制转换
题目相关伪代码
函数 transform(输入参数: 十进制整数 x10):
// 初始化一个栈 s 用于存储八进制数的每一位
创建一个整数类型的栈 s
// 初始化一个布尔变量 flag 用于标记输入的数是否为负数
布尔变量 flag 初始化为 false
// 若输入的数为负数,标记为负数并取绝对值
如果 x10 小于 0:
flag 设置为 true
x10 取绝对值(即 x10 = -x10)
// 若输入的数为 0,直接输出 0 并换行
如果 x10 等于 0:
输出 x10
输出换行符
// 当 x10 不为 0 时,不断取余并压入栈,同时更新 x10 为商
当 x10 大于 0 时:
将 x10 对 8 取余的结果压入栈 s
x10 更新为 x10 除以 8 的整数商
// 若原数为负数,先输出负号
如果 flag 为 true:
输出负号 "-"
// 依次弹出栈中的元素并输出,直到栈为空
当栈 s 不为空时:
输出栈顶元素
弹出栈顶元素
结束函数
函数代码
void transform(int x10)
{
stack<int> s;
bool flag = false;
if (x10 < 0)
{
flag = true;
x10 = -x10;
}
if (x10 == 0)
{
cout << x10 << endl;
}
while (x10)
{
s.push(x10 % 8);
x10 /= 8;
}
if (flag)
{
cout << "-";
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
题目三:银行业务队列简单模拟
函数相关伪代码
int main()
{
//创建两个整型队列qa,qb;
int x,m,f=0;
//记录有x个人;
//奇数进qa,偶数进qb;
while (!qa.empty() && !qb.empty())
{
//qa队列输出两个栈顶的;
//qb队列输出一个栈顶的;
}
//将qb队列中剩余的输出;
cout<<endl;
}
函数代码
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> qa, qb;
int x,m,f=0;
cin >> x;
for (size_t i = 0; i < x; i++)
{
cin >> m;
if (m%2==1)
{
qa.push(m);
}
else
{
qb.push(m);
}
}
while (!qa.empty() && !qb.empty())
{
for (size_t i = 0; i < 2; i++)
{
if(f==0){cout << qa.front();f++;}
else{cout << " " << qa.front();}
qa.pop();
}
if(f==0){cout << qb.front();f++;}
else{cout << " " << qb.front();}
qb.pop();
}
while (!qa.empty())
{
if(f==0){cout << qa.front();f++;}
else{cout << " " << qa.front();}
qa.pop();
}
while (!qb.empty())
{
if(f==0){cout << qb.front();f++;}
else{cout << " " << qb.front();}
qb.pop();
}
cout<<endl;
}
题目四:符号配对
函数相关伪代码
bool isMatch(char a, char b) {
if (a == '/' && b == '*') return 1;
if (a == '[' && b == ']') return 1;
if (a == '{' && b == '}') return 1;
if (a == '(' && b == ')') return 1;
return 0;
//预设括号配对,一队的返回1,不一队的返回0;
}
int main()
{
//创建字符型栈s1;
string input;
char c;
int i = 0;
while (true)
{
//将字符一个一个的录入c;
//如果c为‘/n’则退出循环;
//如果c为左括号就入栈;
//如果c为右括号就与栈中最后一个左括号比较并出栈,如果相同就返回1,否则返回0;
}
//如果非空就出栈一个并输出'no';
//如果全部配对且栈空就输出'yes';
//如果有不配对的且栈空就输出'no';
}
函数代码
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool isMatch(char a, char b) {
if (a == '/' && b == '*') return 1;
if (a == '[' && b == ']') return 1;
if (a == '{' && b == '}') return 1;
if (a == '(' && b == ')') return 1;
return 0;
}
int main()
{
stack<char>s1;
string input;
char c;
int i = 0;
while (true)
{
char c;
cin.get(c);
if (c == '\n')break;
if (c == '(' || c == '[' || c == '{')
{
s1.push(c);
}
else if (c == ')' || c == ']' || c == '}')
{
if (!s1.empty() && isMatch(s1.top(), c))
{
s1.pop();
}
else
{
s1.pop();
i++;
}
}
}
if (!s1.empty())
{
char n = s1.top();
s1.pop();
cout << n << endl;
cout << "no" << endl;
}
else if(i==0 && s1.empty())
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
三、实验使用环境(本次实验所使用的平台和相关软件)
以下请根据实际情况编写
- 操作系统:Windows 10
- 编程语言:C++
- 开发工具:Visual Studio 2022
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
以下请根据实际情况编写
题目一:栈与队列-stack、queue与string小综合
PTA提交截图

题目二:数制转换
本机运行截图



题目三:银行业务队列简单模拟
PTA提交截图

题目四:符号配对
本机运行截图

PTA提交截图
![PTA提交截图]()
五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)
以下请根据实际情况编写
遇到的问题及解决方法:
符号配对无法完成栈空括号不匹配的问题。
实验体会和收获:
- 学会了如何搭建C++开发环境。
- 掌握了基本的代码调试方法。
- 掌握了Visual Studio调试功能的基本使用
六、附件(参考文献和相关资料)
以下请根据实际情况编写

浙公网安备 33010602011771号