2つのスタックキューのオファーを証明安全(9度OJ1512)

件名の説明:

キューを達成するための2つのスタック、完了キューのプッシュとポップ操作。
キューの要素がint型。

 

入力:

各入力ファイルは、試験サンプルが含まれています。
各試験サンプルについて、最初の入力のラインN(1 <= N <= 100000)、 キューの動作を表す数。
次のn行、入力キュー操作の各行:
キューに1プッシュPUSH X-整数x(x> = 0)
2 POPは、キューの数を開きます。

 

出力:

キューからデジタルポップポップのすべての印刷操作、各テストケースに対応します。ポップ操作が行われた場合、キューは、印刷空である-1

サンプル入力:

3
PUSH 10
POP
POP

出力例:

10
-1

 

問題解決のアイデア:

要求キューの第一の主題は、2つのスタックを表します。これは、2つのスタックを自分で使用するのが最適です、私はOJが検出されたのか分からないが、それはキューを使用する必要があります十分ではありません。
その後、我々は、スタック自体がキューであるFIFOの最後で、ハノイの塔を思い出しました。それでは、どのようにそれを設計するには?
2つのスタック、最初のPUSHのための1つのスタック、POPための第二のスタック。
注意すべき問題点である2つのスタックの真ん中の周りの要素の順序は任意にすることはできません。限りスタック2の要素があるように存在し、それは、圧力要素にスタック2を積み重ねることができませんそのようなものとして
新しい要素は、1〜3を積み重ねます
図2は、要素21のスタックであります
次に、2つのスタックのリストは、次のとおりです。
3
2 1
スタックの外にこの時間を注文するにはでなければなりません
1 2 3
この時点で、スタック1上にスタック2は、スタックの順番になる場合
3 1 2
したがって、要素が空である場合、スタック2が再び素子1のスタックにプッシュスタック2で保証されるべきではありません

コード:

#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;
}

 

ます。https://my.oschina.net/u/204616/blog/545514で再現

おすすめ

転載: blog.csdn.net/weixin_33743703/article/details/91989981