九度 1512 用兩個棧實現佇列

2021-06-22 01:57:23 字數 1552 閱讀 7594

時間限制:1 秒

記憶體限制:128 兆

特殊判題:否

提交:1327

解決:492

題目描述:用兩個棧來實現乙個佇列,完成佇列的push和pop操作。

佇列中的元素為int型別。

輸入:每個輸入檔案包含乙個測試樣例。

對於每個測試樣例,第一行輸入乙個n(1<=n<=100000),代表佇列操作的個數。

接下來的n行,每行輸入乙個佇列操作:

1. push x 向佇列中push乙個整數x(x>=0)

2. pop 從佇列中pop乙個數。

輸出:對應每個測試案例,列印所有pop操作中從佇列pop中的數字。如果執行pop操作時,隊列為空,則列印-1。

樣例輸入:

3

push 10

poppop

樣例輸出:

10

-1

分析:

首先交代一下兩個棧s1、s2的含義,棧s1是用於提供入隊的,s2是提供出隊的。

方法

一、如果操作是push時,(1)棧s2非空,那麼就要把棧s2中的元素壓入棧s1中,然後再讀取將被push的資料idata,並把它壓入s1中,(2)棧s2為空,那麼就可以直接讀取被push的資料idata,並把它壓入s1中。如果兩個棧都為空,那麼pop時,只有列印"-1",否則就要把棧s1中的元素倒入棧s2中,留下棧s1中的乙個資料然後直接彈出棧s1中的元素,這樣減少一次操作(壓入棧s2的操作),如果接下來是一系列的pop操作,那麼就可直接彈出s2的棧頂元素,然後如果是push,那麼再把棧s2中的元素全部倒入棧s1中,然後讀取資料並把它壓入s1中,這是乙個一般的想法。

方法

二、方法一可以優化一下,這個優化是:如果操作是push,那麼直接讀取資料並把它壓入s1中,如果操作是pop,並且s2非空,那麼就可直接彈出棧s2的棧頂元素,無需管s1是否為空,仔細考慮考慮,其實就是利用了棧的性質。

#include #include #include #include using namespace std;

const int maxn = 100010;

int main()

if(!s2.empty())//棧s2非空,那麼直接彈出棧頂元素

if(s1.empty())//到此,說明s2棧空,如果s1也是棧空,那麼說明沒有元素,列印「-1」

len = s1.size();//到此說明s2棧空,棧s1非空,那麼就要把棧s1中的元素倒入s2中,不用倒完,留下s1中乙個元素,直接彈出

while(len > 1)

printf("%d\n", s1.top());

s1.pop();

}return 0;

}

題目1512 用兩個棧實現佇列

題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。輸入 每個輸入檔案包含乙個測試樣例。對於每個測試樣例,第一行輸入乙個n 1 n 100000 代表佇列操作的個數。接下來的n行,每行輸入乙個佇列操作 1.push x 向佇列中push乙個整數x x 0 2....

題目1512 用兩個棧實現佇列

時間限制 1 秒 記憶體限制 128 兆 題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。輸入 每個輸入檔案包含乙個測試樣例。對於每個測試樣例,第一行輸入乙個n 1 n 100000 代表佇列操作的個數。接下來的n行,每行輸入乙個佇列操作 1.push x...

用兩個棧實現佇列 用兩個佇列實現棧

劍指offer 面試題7 用兩個棧實現佇列。templateclass cqueue 我們試著用兩個棧來模擬佇列的操作,發現如下可行操作 完整 實現 面試題7 用兩個棧實現佇列 分別完成在隊尾插入結點和在隊頭刪除結點的功能。date 2014 06 27 include include includ...