实验3--栈与列队

一、目的(本次实验所涉及并要求掌握的知识点)
1.掌握STL中string的使用
2.熟练掌握STL中栈(stack)和队列(queue)的基本使用
3. 掌握栈和队列的一些典型应用

二、实验内容与设计思想

  1. 栈的应用(数制转换:十进制转八进制)
    (1) 函数相关伪代码*
void converDectOct(int x){
  stack <int> result;
  当x=0时:
  cout<<"0"<<endl;
  当x>0时:
  z=x%8;
  result.push(z);
  x=x/8;
  当栈result不为空时:
  cout<<result.top();
  result.pop();
}

** (2)函数代码**

#include <iostream>
#include<stack>
#include<string>

using namespace std;

int main()
{
    int x;
    cin >> x;
    stack<int> result;
    int z;
    if (x == 0)
    {
        cout << "0" << endl;
        return 0;
    }
    while (x > 0)
    {
        z = x % 8;
        result.push(z);
        x = x / 8;
    }
    while (!result.empty())
    {
        cout << result.top();
        result.pop();
    }
    cout << endl;
    return 0;
}

2.递归程序编写(4.2)
(1)函数相关伪代码

void test(int& sum) {
  stack<int> stk;
  当(true):
    int x;
    cin>>x;
    stk.push(x);
    如果x=0:
      break;
  当stk不为空时:
    result=stk.top();
    stk.pop();
  如果result=0:
     cout<<sum
  其他:
     sum+=result;

(2)函数代码

#include <iostream>
#include<stack>
#include<string>

using namespace std;

void test(int& sum) {
	stack<int> stk;
	int x;
	while (true)
	{
		cin >> x;
		stk.push(x);
		if (x == 0)
		{
			break;
		}
	}
	sum = 0;
	while (!stk.empty())
	{
		int result = stk.top();
		stk.pop();
		if (result == 0)
		{
			cout << sum << endl;
		}
		else {
			sum += result;
			cout << sum << endl;
		}
	}
}

int main()
{
	int s = 0;
	test(s);
	return 0;
}

3.队列的应用(舞伴问题)
(1)函数伪代码

初始化两个空队列queue_men,queue_women
将所有男生和女生分别加入队列
当queue_men,queue_women都不为空时:
man=queue_men.pop()
women=queue_women.pop();
输出men和women
如果!men.empty():
cout<<剩下的男生<<endl;
如果!women.empty():
cout<<剩下的女生<<endl;
否则:cout<<所有人配对成功<<endl

(2)函数代码

#include <iostream>
#include <queue>
#include <string>

using namespace std;

struct Person {
    string name;
    char gender;
};

int main() {
    queue<Person> queue_men;
    queue<Person> queue_women;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        Person p;
        cin >> p.name >> p.gender;
        if (p.gender == 'M' || p.gender == 'm') {
            queue_men.push(p);
        }
        else if (p.gender == 'F' || p.gender == 'f') {
            queue_women.push(p);
        }
    }
    while (!queue_men.empty() && !queue_women.empty()) 
    {
        Person man = queue_men.front();
        queue_men.pop();
        Person woman = queue_women.front();
        queue_women.pop();
        cout << man.name << " 和 " << woman.name << " 配对成功" << endl;
    }
    if (!queue_men.empty()) {
        while (!queue_men.empty()) {
            cout << queue_men.front().name << " ";
            queue_men.pop();
        }
        cout << endl;
    }
    if (!queue_women.empty()) {
        while (!queue_women.empty()) {
            cout << queue_women.front().name << " ";
            queue_women.pop();
        }
        cout << endl;
    }
    if (queue_men.empty() && queue_women.empty()) {
        cout << "\n所有人配对成功" << endl;
    }
    return 0;
}

三、实验使用环境(本次实验所使用的平台和相关软件)
1.操作系统:Windows 11
2.编程语言:C++
3.开发工具:Visual Studio 2026

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

  1. 栈的应用(数制转换:十进制转八进制)
    运行截图

image

屏幕截图 2026-04-05 214629

2.递归程序编写(4.2)
运行截图

屏幕截图 2026-04-05 215143

屏幕截图 2026-04-05 215217

3.队列的应用(舞伴问题)
运行截图

屏幕截图 2026-04-05 215434

屏幕截图 2026-04-05 215453

屏幕截图 2026-04-05 215509

五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)
1.实验中遇到的问题及解决过程
1.问题:结构体忘记初始化

  • 解决方法:要考虑极端情况
  1. 问题:在4.2中容易陷入死循环
  • 解决方法:一定要记得输入0
    2.实验体会和收获
    (1).学会了舞伴问题如何使用队列解决
    (2).学会了使用栈来进行数值转换

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

posted @ 2026-04-05 22:10  lansariel  阅读(7)  评论(0)    收藏  举报