2021.9.28数据结构实验课作业——栈和队列的应用

栈的应用:进制转换
使用栈结构,将用户输入的非负十进制数n,将其转换成m(1<m<10)进制数输出。

队列的应用:秋天的第一杯奶茶
使用队列结构,模拟奶茶店的排队服务。受“秋天的第一杯奶茶”影响,奶茶店门口排起了长队,假设店门口最多可容纳M人排队等待。客户到达奶茶店后,首先要自动取号,排在队伍最末尾;工作人员总是先做排在第一位的客户订单。若门口排队人数已满M人,工作人员告知“排队人数太多,请稍后再来”;若所有客户订单全部完成,则提示工作人员休息。

进制转换

点击查看代码
/*
 * 就是基本的进制转换
 * 压到栈里面最后挨个弹出即可
*/
#include <cstdio>
#include <iostream>
using namespace std;

const int Maxn = 1001;
template <typename T>
class Stack {
private:
	int top;
	T sta[Maxn];
public:
	Stack() {
		top = 0;
	}
	Stack(int n, int a[]) {
		top = n;
		for(int i=0; i<n; ++i)
			sta[i] = a[i];
	}
	void Push(T x) {
		if(top == Maxn) throw "Fulled!";
		sta[top++] = x;
	}
	T GetTop() {//只输出,不弹出
		if(Empty()) throw "Empty!";
		return sta[top-1];
	}
	void Pop() {//弹出不输出
		if(Empty()) throw "Empty!";
		--top;
	}
	bool Empty() {
		return top == 0;
	}
};

int main(void) {
	ios::sync_with_stdio(false);
	int n, m;
	Stack<int> s;
	cout << "输入原数字: ";
	cin >> n;
	cout << "输入进制: ";
	cin >> m;
	do {
		s.Push(n%m);
		n /= m;
	}while(n != 0);
	while(!s.Empty()) {
		cout << s.GetTop();
		s.Pop();
	}
	return 0;
}

秋天的第一杯奶茶
话说这个梗到底是什么意思啊。。。。

点击查看代码
/*
 * 基本思路就是维护入队、出队两个函数,记录最新顾客编号
 * 用了循环队列(想加平时分的屑)
 * 不过我好像写的有瑕疵,从第二次队列循环利用开始队列实际可用大小减少1,没想到什么好办法修改
 * 另外,throw后跟字符串常量好像会有异常输出
 * 啧,懒得改了
*/
#include <cstdio>
#include <iostream>
using namespace std;

const int Maxn = 10;
template <typename T>
class Queue {//循环队列
private:
	int first, rear, sum, total;
	T que[Maxn];
public:
	Queue() {
		first = rear = 0;
		sum = total = 0;
	}
	Queue(int n, T a[]) {
		rear = n;
		for(int i=0; i<n; ++i)
			que[i] = a[i];
	}
	void EnQueue() {
		if(rear+1 == first) {
			cout << "排队人数太多,请稍后再来!" << endl;
			return ;
		}
		//cout << rear << endl;
		que[rear++] = ++total;
		cout << "取号成功,单号为: " << total << endl;
		if(rear == Maxn)
			rear = -1;//置为-1可用于判断队列已满 
	}
	void DeQueue() {
		if(Empty()) throw "Empty!";
		cout << "请" << que[first++] << "号顾客取餐" << endl;
		if(first == Maxn)
			first = 0;
		if(rear == -1)//此时可以确认队列0位置为空 
			++rear;//这样会导致从第二次使用0位置开始队列会少一个位置,但我实在不知道咋改 
		if(Empty())
			cout << "请工作人员休息" << endl;
	}
	T GetQueue() {
		if(Empty()) throw "Empty!";
		return que[first];
	}
	bool Empty() {
		return first == rear;
	}
};

int main(void) {
	ios::sync_with_stdio(false);
	int x;
	Queue<int> q;
	do {
		cin >> x;
		switch(x) {
			case 1:
				q.EnQueue();
				break;
			case 2:
				q.DeQueue();
				break;
		}
	}while(x != 0);
	return 0;
}
posted @ 2021-10-09 21:56  快乐永恒  阅读(113)  评论(0编辑  收藏  举报