• 用两个栈实现队列(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 };
  • 相关阅读:
    Spoj 2798 Qtree3
    [HAOI2015]树上操作
    Grass Planting
    [ZJOI2008] 树的统计Count
    Spoj375 Qtree--树链剖分
    [HNOI2012]永无乡
    雨天的尾巴
    temp
    线段树动态开点之逆序对
    线段树动态开点
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13198508.html
Copyright © 2020-2023  润新知