棧呢,就像裝羽毛球的圓筒一樣(一頭堵上),你只能先放進去的後拿出來,而後放進去的先拿出來。
可以用數組,和一個下標模擬棧,比如一個數組a[ ](數組長度視情況而定),一個指針idex:
idex = 1;時棧爲空;
idex > 1;時1~(idex-1)都有值,即idex指向最後一個值的 後面的下標;
根據這道題,話不多說見代碼:
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[1011] = {0, 0, 0, 0};//存貯所給數據
int b[1011] = {-1, -1, -1};//模擬棧用的數組
int n;
while(scanf("%d",&n), n != 0)
{
while(scanf("%d",&a[0]), a[0]!=0)
{
for(int i = 1; i < n; i++)
{
scanf("%d",&a[i]);
}
int p = 1;//這裏的p就是上面所說得idex
int i, j;
for(j=1, i=0; (j<=n) || (i<n && a[i]==b[p-1]); j++)//j是A方向上依次過來的火車,i做數組a的下標
{
if(a[i] == j)//j能直接走到B的方向上
{
i++;
}
else
{
while(a[i] == b[p-1])//棧裏面能走到B方向上的火車都讓走出去,如果不,則下面來的火車將直接壓在它上面
{
i++;
p--;
}
if(j <= n)//j不能直接走到B方向上,則把它壓進棧內
{
b[p]=j;
p++;
}
}
}
if(i == n)//如果A方向上來的火車都按所給順序出去了,則數組a的下標指向n
printf("Yes\n");
else
printf("No\n");
}
printf("\n");
}
return 0;
}