用两个栈实现队列(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 };