UVA 514 stack
程序员文章站
2024-03-19 08:16:22
...
stack的运用
紫书上给的代码是wa的 但思路没问题 是在输入上有bug
然而我也每太看懂这个题对0那块的处理要求
连着的两个0是什么啊
懒得搞了
贴一个过了的代码和书上的代码
#include <iostream>
#include <stack>
using namespace std;
const int len = 1024;
int coaches[len];
int main() {
int n;
while (cin >> n, n) {
stack<int> s;
// read the required permutaion
while ( cin >> coaches[0], coaches[0]) {
for (int i = 1; i < n; i++) {
cin >> coaches[i];
}
int lenB = 0, aId = 1;
bool ok = true;
while (lenB < n) {
if (aId == coaches[lenB]) { aId++; lenB++; }
else if(!s.empty() && s.top() ==coaches[lenB]) { s.pop(); lenB++; }
else if(aId <= n) s.push(aId++);
else { ok = false; break; }
}
cout << (ok ? "Yes" : "No") << endl;
}
cout << endl;
}
return 0;
}
书上的
#include<iostream>
#include<stdio.h>
#include<stack>
//WA
using namespace std;
const int MAXN = 1000 + 10;
int n, target[MAXN];
int main()
{
while(scanf("%d", &n) == 1) //输入 一共n辆火车
{
if(n!=0)
{
stack<int> s; //声明栈S
int A = 1, B = 1; // A:进站顺序 1,2,3,...,n B:出站顺序(数组target的下标)
for(int i = 1; i <= n; i++)
{
scanf("%d", &target[i]); //输入出站顺序
}
int ok = 1; //标志,是否可以按顺序出站
while(B <= n)
{
if(A == target[B]) //要进站的火车与要出站的火车为同一辆,则进站后直接出站
{
A++; B++;
}
else if(!s.empty() && s.top() == target[B]) //栈(站)非空,栈顶与要出站的火车相同,则出站
{
s.pop();
B++; //要出站的++
}
else if(A <= n) //要进站的与出站的不同,只进站,先等着,当栈顶与目标相同时再出(上一个if)
{
s.push(A++);
}
else
{
ok = 0; //正常结束循环为b=n, 若前几种情况都不符合,则不能按照要求顺序出站,break
break;
}
}
printf("%s\n", ok ? "Yes" : "No");
}
else printf("\n");
}
return 0;
}
推荐阅读
-
The Hamming Distance Problem UVA - 729 (推荐使用 next_permutation())
-
UVA 514 stack
-
POJ1420 HDU1659 UVA196 UVALive5606 Spreadsheet【DFS】
-
uva 270 Lining Up
-
Dragon of Loowater UVA - 11292 勇者斗恶龙 贪心
-
勇者斗恶龙(Dragon of Loowater ,UVa 11292)
-
UVa 10205 - Stack 'em Up
-
uva --- UVA10881蚂蚁
-
Protostar Stack Write Up
-
UVa10881 【 Piotr's Ants】