c++ 棧的基本應用
題目描述
記憶力大考驗
小哼和小哈是一對兄妹,爸媽不在家的時候,小哼自然而然就擔負起了照顧妹妹的責任。可別看小哼年紀小,他哄妹妹可有一手呢。今天,小哼就發明了一個小游戲來和小哈玩:
家里有一個長長的網球筒,還有一堆的網球,網球筒的直徑很小,每次只能放進一個網球。小哼把每個網球都編了號(所有網球編號不一樣),小哼有兩種選擇:第一種,拿一個小球放進球筒里;第二種,小哼會從球筒里拿出一個網球。而小哈要做的,就是每次小哼從球筒里拿出網球之前,憑記憶力猜出拿出來的網球編號是多少。
輸入
輸入包括多行,每行描述一條操作信息:
1.輸入字母’I’,后面緊跟着一個整數x(1<=x<=100),表示當前要在球筒中放入編號為x的球;
2.輸入字母’O’,表示當前要從球筒里拿出一個球。
輸出
輸出拿出網球的順序,每個編號占一行,如果在取球的時候,球筒中已經沒有球,請輸出” Empty!”。
樣例輸入
O
I 6
I 4
O
I 7
I 1
O
I 8
O
O
O
O
樣例輸出
Empty!
4
1
8
7
6
Empty!
提示
代碼
#include <bits/stdc++.h>
using namespace std;
long long q[10000000];
char tmp[10];
int f;
int main()
{
memset(q,0,sizeof(q));
char c;
while (scanf("%c",&c) != EOF)
{
long long x;
if (c == 'I')
{
printf("輸入 : ");
cin >> x;
f ++;//f是棧里球的個數
q[f] = x;
}
else
{
if (f != 0)
{
printf("輸出 : ");
printf("%lld\n",q[f]);
f --;//拿出最后放入的那個球
}
else
{
printf("輸出 : ");
printf("Empty!\n");
}
}
gets(tmp);
}
}
記憶力大考驗升級版
題目描述
游戲進行到一半,小(賤)哈(人)突然有了一個想法:不能老是讓小哼考自己呀,現在讓我來考考他吧……於是,游戲有了下面這個版本:
小哈會給出一個放球的順序,和一個拿球的順序,小哼需要快速地實現。但是,玩着玩着,小哼發現問題沒這么簡單,有些序列根本就沒有辦法做到。現在,把兩個序列都告訴你,請你先幫小哼預判一下他能不能做到。
輸入
輸入數據有多組(不會超過100組):
第一行輸出一個整數n,表示現在有n個球(1<=n<=100);
接下來輸入兩行,每行n個數(所有的數不超過int范圍),分別表示放球的順序和拿球的順序。
輸出
對於每組數據,如果可以實現,輸出:”YES!”,否則輸出:”NO!”。
樣例輸入
5
1 2 3 4 5
3 4 2 1 5
5
1 2 3 4 5
3 1 2 4 5
樣例輸出
YES!
NO!
提示
Code
#include <bits/stdc++.h>
using namespace std;
int a[101],b[101],s[101],n;
int p,e;
int main()
{
bool flag = 0;
while (scanf("%d",&n)!= EOF)//一直讀到文件末尾
{
for (int i = 1;i <= n;i ++)//輸入
{
cin >> a[i];
}
for (int i = 1;i <= n;i ++)//輸入
{
cin >> b[i];
}
p = 1;e = 0;//e是棧的下標 p是從a[]中拿的順序
for (int i = 1;i <= n;i ++)
{
int key = b[i];//key 是現在要 取得數字
while (s[e] != key && p <= n)//如果 正在放入的數字 等於你要取出的數字(key)
{
///////////把數字放到棧里面///////////////////
e ++;
s[e] = a[p];
p ++;
///////////把數字放到棧里面完畢///////////////////
}
if (s[e] == key)//把這個數字從棧里面刪掉
{
e --;//刪除
}
else
{
flag = 1;//發現不可行
break;
}
}
if (flag == 1)
{
cout << "NO!" << endl;
}
else
{
cout << "YES!" << endl;
}
}
}