![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 DN Huang ![]()
![]() |
如果我輸入: 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; } 請問該如何實現? |
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
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |