1. 程式人生 > 實用技巧 >用兩個棧實現佇列(Python and C++解法)

用兩個棧實現佇列(Python and C++解法)

題目:

  用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 appendTail 和 deleteHead ,分別完成在佇列尾部插入整數和在佇列頭部刪除整數的功能。(若佇列中沒有元素,deleteHead操作返回 -1 )

示例 1:

輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]
示例 2:

輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]

輸出:[null,-1,null,null,5,2]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof

思路:

  stack1只負責入棧元素即可。

  在刪除stack2中的元素時,需要考慮特殊情況:如果stack2非空,直接出棧棧頂元素;如果stack2為空,且stack1為空,返回-1,如果satck1非空,需要將stack1中的元素全部壓入stack2,將stack1中的元素倒序排列。

Python解法:

 1 class CQueue:
 2     def
__init__(self): 3 self.stack1 = [] 4 self.stack2 = [] 5 6 def appendTail(self, value: int) -> None: 7 self.stack1.append(value) 8 return [] 9 10 def deleteHead(self) -> int: 11 if not self.stack2: # 如果stack2是空的,不能用self.stack2 is []進行判斷!!!!!!!!!!!!
12 if not self.stack1: # 如果stack1是空的 13 return -1 14 else: 15 while self.stack1: # 如果stack1不是空的,把它的元素全部壓入stack2 16 self.stack2.append(self.stack1.pop()) 17 return self.stack2.pop() 18 else: 19 return self.stack2.pop()

C++解法:

 1 class CQueue {
 2 public:
 3     stack<int> stack1;
 4     stack<int> stack2;
 5     CQueue() {
 6 
 7     }
 8     
 9     void appendTail(int value) {
10         stack1.push(value);
11     }
12     
13     int deleteHead() {
14         if(stack2.empty()) {
15             if(stack1.empty()) 
16                 return -1;
17             else {
18                 while(!stack1.empty()) {
19                     int temp = stack1.top();
20                     stack2.push(temp);
21                     stack1.pop();  // C++的pop只能刪除元素,沒有返回值
22                 }
23             }
24         }
25         int tempRes = stack2.top();
26         stack2.pop();
27         return tempRes;
28     }
29 };