出棧順序問題
大家好,初次見面。
那麼,讓我們先來看一下題目。
題目描述
n列火車按照1,2,3… …n的順序進站,那麼出站的順序可能是下面的序列嗎,如果能輸出Yes,否則輸出No
輸入
第一行一個整數n(n<=1000)
第二行n個整數,為出站序列
輸出
Yes 或者No
樣例輸入
5
5 4 1 2 3
樣例輸出
No
好了。
這是個關於出棧順序的問題。題目中規定了進棧的順序是一定的,因此不同時間的出棧導致了最終的出棧順序的不同。解決這個問題,我們可以模擬整個過程。請記住,棧有先進後出,後進先出的性質。
好了,我們先開一個棧。
int a[1010],n;
int top=0;
a是我們的出棧順序,n是火車的數量,top是我們的棧頂(並不需要把棧都存起來,此題從1,2,一直到n的進站順序特性使我們只用一個top就可以知道棧裡的元素都是啥)。
接下來我們輸入將要判斷的出棧順序。
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
然後是關鍵環節,判斷此出棧順序是否合法(廢話)。
要知道,剛開始我們的火車站裡是沒車的,必須往裡開車(不,不是藍色連結)才行,拿題目樣例輸入舉例,第一個開出的車是5,而我們入站的順序一定,所以,我們必須先讓1號車,然後讓2號車進站,一直到5號車進站,才能使第一個出站的車為五號車。
推廣一下,如果想讓m號車出站,就必須一號二號一直到m號都進站。
while(top!=a[1])
{top++;}
我們先保證第一位出站的車編號對上,其他的之後慢慢考慮。
這一步可以稱之為預處理,下一步是判斷。
(敲黑板)如果你現在的棧頂車編號就是對應的出棧順序的車的編好,皆大歡喜,判斷下一個出棧的車編號和你的棧裡的下一位。
而如果你的棧頂元素大於對應的出棧的車編號,說明本應該出站的車被壓在了底下,而棧是沒法讓它出去的(除非你是鐵但火車俠),因此直接可知這個出站順序不合法。 輸出並結束程式。
最後一種情況,棧頂元素小於你要出站的車編號,說明你要出站的車還沒進站,再重複你最開始的進站操作,
判斷程式碼如下
for(int i=1;i<=n;i++)
{
if(top==a[i])
{
top--;
}
else if(top>a[i])
{
printf("No");
return 0;
}
else
{
while(top!=a[i])
{top++;}
i--;
}
}
而如果都判斷完了後你的程式還在執行,證明你的出站順序合法,輸出yes並歡呼吧,不會發生火車相撞的事故。
printf("Yes");
完整程式碼如下:
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a[1010],n;
int top=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
while(top!=a[1])
{top++;}
for(int i=1;i<=n;i++)
{
if(top==a[i])
{
top--;
}
else if(top>a[i])
{
printf("No");
return 0;
}
else
{
while(top!=a[i])
{top++;}
i--;
}
}
printf("Yes");
}
好了今天的首次講題就到這裡,第一次與大家見面還是自我介紹一下,我叫霞客88,又弱又水的辣雞一枚哈(但還是想成為dalao),以後可能會是=時不時寫點啥,寫的不好還請各位見諒。
關於這題有什麼不懂的諸位可以提,我儘量解答,我有什麼錯誤,疏忽,漏洞也歡迎大家指出,大家共同進步共同發展,初次見面多多包涵。
那麼,祝您身體健康(提乾涉經),再見。