用兩個棧實現佇列(Python and C++解法)
阿新 • • 發佈:2020-06-27
題目:
用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 appendTail 和 deleteHead ,分別完成在佇列尾部插入整數和在佇列頭部刪除整數的功能。(若佇列中沒有元素,deleteHead操作返回 -1 )
示例 1:
輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]
示例 2:
輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[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 };