• 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;
    }
    
  • 相关阅读:
    Android开发新手学习总结(六)——android开发目录结构【图文版】
    Android开发新手学习总结(一)——使用Android Studio搭建Android集成开发环境
    62个Android Studio小技巧合集
    Android Studio 入门指南
    Unity操作
    Unity的安装和破解
    pb数据窗口设置操作
    Roll A Ball
    c实现旋转数列
    用循环添加多行、多列视图
  • 原文地址:https://www.cnblogs.com/kuaileyongheng/p/15387923.html
Copyright © 2020-2023  润新知