劍指OFFER之用兩個棧實現隊列(九度OJ1512)

題目描述:

用兩個棧來實現一個隊列,完成隊列的Push和Pop操做。
隊列中的元素爲int類型。測試

 

輸入:

每一個輸入文件包含一個測試樣例。
對於每一個測試樣例,第一行輸入一個n(1<=n<=100000),表明隊列操做的個數。
接下來的n行,每行輸入一個隊列操做:
1. PUSH X 向隊列中push一個整數x(x>=0)
2. POP 從隊列中pop一個數。spa

 

輸出:

對應每一個測試案例,打印全部pop操做中從隊列pop中的數字。若是執行pop操做時,隊列爲空,則打印-1設計

樣例輸入:

3 PUSH 10 POP POP

樣例輸出:

10
-1

 

解題思路:

首先題目要求,兩個棧表示隊列。那麼最好就用兩個棧嘍,雖然不知道OJ是怎麼檢測的,可是應該用一個隊列是不行的。
那麼咱們想起了漢諾塔,棧自己是後進後出,隊列是先進先出。這樣如何來設計呢?
使用兩個棧,第一個棧用來PUSH,第二個棧用來POP。
要注意的問題是,兩個棧中間的處處元素的順序不能亂。只要棧2中還有元素存在,棧1就不能往棧2中壓元素。好比
棧1新進元素3
棧2中元素爲 2 1,
那麼兩個棧的列表爲:
3
2 1
此時若是要出棧的順序必須是
1 2 3
若是此時把棧1壓入棧2,出棧的順序就成爲
3 1 2
所以,切忌要保證棧2中的元素爲空時,再向棧2內壓入棧1的元素

代碼:

#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <string.h>
#define MAX 100001
int stack1[MAX],stack2[MAX],top1,top2; int main(void){ int n,i,m; char input1[10]; while(scanf("%d",&n)!=EOF && n<=100000 && n>= 1){ top1 = top2 = 0; memset(&stack1,0,sizeof(int)*MAX); memset(&stack2,0,sizeof(int)*MAX); for(i=0;i<n;i++){ scanf("%s",input1); if(strcmp(input1,"PUSH") == 0){ scanf("%d",&m); stack1[top1++] = m; }else{ if(top2 == 0){//判斷棧2是否還存在元素 while(top1){ stack2[top2++] = stack1[--top1]; } } if(top2)//若是棧2中有元素,則彈出,不然,表示兩個棧都沒有元素 printf("%d\n",stack2[--top2]); else{ printf("-1\n"); } } } } return 0; }
相關文章
相關標籤/搜索