实验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;
    }
}

三、实验使用环境(本次实验所使用的平台和相关软件)

以下请根据实际情况编写


四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)

以下请根据实际情况编写

题目一:栈与队列-stack、queue与string小综合

PTA提交截图
PTA提交截图

题目二:数制转换

本机运行截图
本机运行截图
本机运行截图
本机运行截图

题目三:银行业务队列简单模拟

PTA提交截图
PTA提交截图

题目四:符号配对

本机运行截图
本机运行截图

PTA提交截图
PTA提交截图

五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)

以下请根据实际情况编写

遇到的问题及解决方法:

符号配对无法完成栈空括号不匹配的问题。

实验体会和收获:

  • 学会了如何搭建C++开发环境。
  • 掌握了基本的代码调试方法。
  • 掌握了Visual Studio调试功能的基本使用

六、附件(参考文献和相关资料)

以下请根据实际情况编写

  1. C++ Primer
  2. 实验3-栈与队列
  3. 相关博客文章
posted @ 2025-03-30 22:08  w4ngXj  阅读(44)  评论(0)    收藏  举报