1. 程式人生 > 其它 >LeetCode--用兩個棧實現佇列

LeetCode--用兩個棧實現佇列

技術標籤:leetcode

題目描述

用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 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]

提示:
1 <= values <= 10000
最多會對 appendTail、deleteHead 進行 10000 次呼叫

思路

佇列是先進先出的資料結構,棧是先進後出的資料結構,怎麼使用棧完成佇列的功能?
對一個空棧來說,先壓入全部資料,然後彈出所有資料,就完成了一次資料的反序,例如輸入陣列[1, 7, 3],彈出時就變成了[3, 7, 1]。可見如果使用一個棧+一個輔助棧,進行兩次反序,就可以完成佇列的功能。當然,這道題在這個基礎上還是要更復雜一些,上面是假設一下壓入全部資料,然後一下彈出所有資料的情況

。本題還要注意:

  1. s1與s2全空又要“出佇列”時,返回-1
  2. "出佇列"時,保證輔助棧已經全為空,然後將原棧所有元素灌入輔助棧後,再依次出棧即可

題解

用C++和Java完成兩種實現,思路完全相同

c++

CQueue.h

#include<stack>
using namespace std;

class CQueue {
    stack<int> s1, s2;
public:
    CQueue() {
        stack<int> s1;
        stack<int> s2;
    }

    void
appendTail(int value) { s1.push(value); } int deleteHead() { if (s2.empty()) { /*要保證s2是空棧才正確*/ while (!s1.empty()) { s2.push(s1.top()); s1.pop(); } } if (s2.empty()) return -1; else { int temp = s2.top(); s2.pop(); return temp; } } };

在這裡插入圖片描述

Java

複雜度分析