台灣最大程式設計社群網站
線上人數
1186
 
會員總數:243466
討論主題:188182
歡迎您免費加入會員
討論區列表 >> C/C++ >> 請問堆疊的問題,我有寫出pseudo code可是不知如何實現,謝謝
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請問堆疊的問題,我有寫出pseudo code可是不知如何實現,謝謝
價值 : 50 QP  點閱數:186 回應數:1

樓主

DN Huang
門外漢
0 4
36 5
發送站內信

題目是這樣子,
如果我輸入:
6
wash X
wash Y
take
wash A
wash B
wash C
他就要輸出:
CBAX
意思就是我可以輸入6個指令,
然後依照last in first out的方式
輸出stack裡的東西。

那如果我輸入:
7
wash E
take
wash F
take
take
take
wash G
他就要輸出:
You're fired!
代表take的盤子大於stack裡的數量
就代表洗碗洗太慢要被開除

這是我的想法:
#include<iostream>
#include<stack>
using namespace std;
int main () {
int n;//指令數
char R;//要用來放wash後面那個字母的
char Q[];//存放wash A~Z或take這個字串
cin>>n;
stack<char> mstack;
//先輸入指令,把他們丟進Q裡//
for(int i=0 ; i<n ; i++) {
cin>>Q[i];
}
//把Q裡的東西丟進stack理//
for(int i=0 ; i<n ; i++) {
if(Q[i]???你輸入的是wash A~Z任一種盤子)//要判斷Q
R=???//把Q裡的東西例如wash A後面那個A給抽出來放到R裡
mstack.push(R);//把R裡的字母塞進stack

else if(Q==take)//你輸入了take
mstack.empty();//msatck是空的
cout<<"You're fired!";
break;

else//你輸入了take,並且stack非空
mstack.pop();//把最上層的東西取走
}
//把stack裡的東西由最上面按順序輸出
while(!mstack.empty()) {
cout << mstack.top() << " ";
mstack.pop();
}
cout << endl;
return 0;
}
請問該如何實現?

搜尋相關Tags的文章: [ 堆疊 ] , [ 盤子 ] ,
本篇文章發表於2018-06-20 23:28
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

Raymond
檢舉此回應
程式有一些語法上及邏輯上的錯誤...

>char Q[];//存放wash A~Z或take這個字串
這不是定義字串的語法, 事實上, C 及 C++ 都沒有內建『字串』類型. C 及 C++ 語言裡所謂的『字串』實際上是個以 「零值字元」作為終結字元的字元陣列.

你可以用固定字元陣列, 或字元指標+動態配置, 或用標準函式庫提供的 std::string class.

> cin>>Q[i];

不管你是那種用固定字元陣列或是字元指標指向動態配置的記憶體, 標準輸入會終止于第一個空格字元 (包括 enter 鍵).

你有兩種方法, 一是用 std::getline() 來讀整行, 然後再解析讀入的資料. 另一個方法是用兩個物件, 先讀入第一個, 根據它的內容來決定要不要讀入第二個. 我修改後的程式用的是第二個方法.

其餘邏輯上的問題, 請自己參考下面的程式, 有問題再另行發問.

最後有幾個建議:
- 一個字元的單字變數如 'i', 'n' 一般是用來當作迴圈的計算變數. 主程式的變數最好用有意義的名字.

- 盡量不要用 using namespace std, 並熟悉用 std:: 來前置所有標準函式庫裡的名字. 如 std::cin. 因為在大型的專案裡, using namespace std 很容易導致名字上的衝突.

- 在單獨使用的情況下, 盡量習慣用前置的 ++ 或 --. 雖然對內建物件沒什麼不同, 但如果 ++ 或 -- 是用在 C++ 的 class 物件上, 前置跟後置在效率上會有差 - 前置的會比較快.

- 用適當的空格來提升原始碼的可讀性.

- 善用本討論區提供的 BBCode, 把原始碼放在適當的標記中, 方便大家閱讀及剪貼.

以下是修改後的原始碼, 我盡量保持你原來的邏輯:


請注意, 為了不讓程式過於複雜, 這裡特意忽略了錯誤檢查及靈活性, 比方說, std::string 的字元比較是有分大小寫的, "wash" 不等於 "WASH". 這點要注意.

本篇文章回覆於2018-06-21 00:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.