博客作业03--栈和队列
生活随笔
收集整理的這篇文章主要介紹了
博客作业03--栈和队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.學習總結
2.PTA實驗作業
2.1 題目1: 銀行業務隊列簡單模擬
2.2 設計思路:
定義兩個隊列A,B 輸入N位顧客的編號,奇數編號入隊A,偶數編號入隊B while(A和B都不為空)循環兩次輸出A的隊頭元素,然后出隊輸出B的隊頭元素,然后出隊 whileB不為空如果B的大小為1輸出隊頭元素,然后出隊否則輸出隊頭元素后加空格,然后出隊 whileA不為空如果A的大小為1輸出隊頭元素,然后出隊否則輸出隊頭元素后加空格,然后出隊2.3 代碼截圖:
2.4 PTA提交列表說明
部分正確:錯誤點卡在A.B隊列一起輸出完還有隊列中有元素的情況,原來的思路比較麻煩,后來經過舍友提示通過判斷隊列里元素個數是否是一個來實現最后一個元素不帶空格
2.1 題目2:jmu-報數游戲
2.2 設計思路:
輸入 n , m //退圈數和總人數 if n>mError結束程序 end 定義隊列 q, 將m個人入隊 int i= 1 //報數 while q.size()!=1 if( i%n==0 ||q.size()<n)輸出本輪退圈的人的編號else 將隊首放到隊尾i++ end 輸出最后一個人的編號2.3 代碼截圖:
2.4 PTA提交列表說明
編譯錯誤:一開始有一步忘記將元素出隊,導致編譯錯誤無法運行
2.1 題目3:銀行排隊問題之單隊列多窗口服務
2.2 設計思路:
struct node{int T,P //到達時間,事務處理時間 }輸入n,k //顧客總數,窗口數定義結構體隊列q(前面定義結構體包含到達和處理事務時間)遍歷第一個到第n個顧客建立節點t輸入T,P //到達時間,事務處理時間 if(t.P>60) t.P=60將節點t入隊endwhile !q.empty()==1flag=1 //是否要等待標志int mintime=9999,mint_=0 //最短等待時間,最短等待時間下標遍歷每個窗口if 到達時間>該窗口最快完成時間窗口完成時間=到達和處理時間之和winnum[i]++ //窗口服務人數flag=0 //標記不用等待出隊并退出循環if 最快完成時間>該窗口完成時間最快完成時間更新為該窗口完成時間mint_=i //存該窗口下表endif flag==1 //要等待 waittime=最快完成時間-到達時間alltime+=waittime //等待總時間winnum[mint_]++ //該窗口服務人數該窗口最快完成時間=最快完成時間+事務處理時間記錄最長等待時間end遍歷k個窗口如果該窗口完成時間>最后完成時間 更新最后完成時間直到找到最后完成時間分別輸出平均等待時間、最長等待時間、最后完成時間遍歷k個窗口輸出每個窗口服務人數2.3 代碼截圖:
2.4 PTA提交列表說明
部分正確:輸出一直錯最后一個數據,后來發現求最后完成時間的時候求錯了,不該是等待時間加處理時間,而是最快窗口完成時間加處理時間,否則和就變小了,值不對
3.截圖本周題目集的PTA最后排名
3.1 棧PTA排名
3.2 隊列PTA排名
4. 閱讀代碼
#include <iostream> #include <algorithm> #include <cstring> #include <stack> #include <cmath>using namespace std;char s[1000]; int i; double Translation(int & i) {double integer = 0.0; double remainder = 0.0; while (s[i] >= '0' && s[i] <= '9'){integer *= 10;integer += (s[i] - '0');i++;}if (s[i] == '.'){i++;int c = 1;while (s[i] >= '0' && s[i] <= '9'){double t = s[i] - '0';t *= pow(0.1, c);c++;remainder += t;i++;}}return integer + remainder; }int GetLevel(char ch) {switch (ch){case '+':case '-':return 1;case '*':case '/':return 2;case '(':return 0;case '#':return -1;}; }double Operate(double a1, char op, double a2) {switch (op){case '+':return a1 + a2;case '-':return a1 - a2;case '*':return a1 * a2;case '/':return a1 / a2;}; }double Compute() {stack<char> optr; stack<double> opnd; optr.push('#');int len = strlen(s);bool is_minus = true; for (i = 0; i < len;){if (s[i] == '-' && is_minus) {opnd.push(0);optr.push('-');i++;}else if (s[i] == ')'){is_minus = false;i++;while (optr.top() != '('){double a2 = opnd.top();opnd.pop();double a1 = opnd.top();opnd.pop();char op = optr.top();optr.pop();double result = Operate(a1, op, a2);opnd.push(result);}optr.pop(); }else if (s[i] >= '0' && s[i] <= '9'){is_minus = false;opnd.push(Translation(i));}else if (s[i] == '('){is_minus = true;optr.push(s[i]);i++;}else{while (GetLevel(s[i]) <= GetLevel(optr.top())){double a2 = opnd.top();opnd.pop();double a1 = opnd.top();opnd.pop();char op = optr.top();optr.pop();double result = Operate(a1, op, a2);opnd.push(result);}optr.push(s[i]);i++;}}while (optr.top() != '#'){double a2 = opnd.top();opnd.pop();double a1 = opnd.top();opnd.pop();char op = optr.top();optr.pop();double result = Operate(a1, op, a2);opnd.push(result);}return opnd.top(); }int main() {while (cin >> s)cout << "結果為:" << Compute()<< endl << endl; }這段代碼的功能是進行四則運算,優點:將部分運算符優先級用數字表示,便于比較字符優先級。
地址:https://gitee.com/adressad/codes/9ystlgoh6b413n5vfupa839
. 代碼Git提交記錄截圖
轉載于:https://www.cnblogs.com/linyiwei/p/8836324.html
總結
以上是生活随笔為你收集整理的博客作业03--栈和队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络 浏览器发送http请求的过
- 下一篇: 在MFC对话框中快速集成三维控件