雞蛋棧
- 描述
-
繼隊列之後,我們又來學習一種新的數據結構——棧。將隊列的頭部封閉後,就構成了棧這種數據結構,原來隊列頭部就是棧底,原來隊列的尾部就是棧頂。棧與隊列的不同就在於棧的底端是封閉的。所以,棧的插入和刪除操作只能在棧的一端進行,即棧頂。棧的插入操作稱爲入棧,刪除操作稱爲出棧。
底________________頂
|
底—————————頂
- 輸入
- 第一行輸入一個數T,表示有T組數據
第二行輸入一個數N,表示有N種操作
接下來N行,每行一種操作,push表示將編號爲x的雞蛋放入棧中,pop表示拿走棧頂部的一個雞蛋。
數據輸入保證合法,棧中沒有雞蛋時不考慮出棧操作! - 輸出
- 在N種操作完成以後,再將棧中的雞蛋逐個出棧,按出棧順序打印雞蛋上的編號,兩個編號之間用空格隔開。如果已沒有雞蛋,則輸出"no eggs!"(不包含引號)。
- 樣例輸入
-
1 3 push 3 push 2 push 1
- 樣例輸出
-
1 2 3
-
個人理解:這題考慮了棧中兩個基本的操作,一個是在棧頂增加元素用到了push()函數,一個是彈出棧頂元素用到了pop()函數,同時,也應知道棧的特點,後進先出。在這個題目當中,先將棧中雞蛋定義成一個結構體,從而方便對其操作,再通過定義一個數組判斷第二個字符是u還是o從而決定是入棧還是彈出棧頂元素,然後,根據棧中元素非負,如果是0,表示棧中沒有雞蛋,大於0纔可以彈出棧中元素,最後在輸出的時候,注意輸出下標爲0的那個元素。
-
-
#include<stdio.h> #include<string.h> struct stack { char s[50]; }x[20000],tp; int main() { int i,t,n;char y[15]; scanf("%d",&t); while(t--) { scanf("%d",&n); int top=0; for(i=0;i<n;++i) { scanf("%s",y); if(y[1]=='u') { scanf("%s",tp.s); x[top++]=tp; } else if(top>0) { --top; } } if(top==0) { printf("no eggs!\n"); continue; } for(i=top-1;i>0;--i) { printf("%s ",x[i].s); } printf("%s\n",x[0].s); } return 0; }