题目一:栈-程序员输入问题
Description:
程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。
input:
输入一行字符,个数不超过 100。
output:
输出一行字符,表示实际有效字符。
sample input:
sdfosif@for (ii#=1,#;i<.#=8;i+++#);
sample output:
for (i=1;i<=8;i++);
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
stack<char>s1;
stack<char>s2;
int main()
{
char s[100];
int len;
cin>>s;
len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]=='@')
{
while(!s1.empty())
s1.pop();
continue;
}
if(s[i]=='#')
{
if(!s1.empty())
{
s1.pop();
continue;
}
}
s1.push(s[i]);
}
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
while(!s2.empty())
{
cout<<s2.top();
s2.pop();
}
return 0;
}
题目二:栈-溶液模拟器
Description:
小谢虽然有很多溶液,但是还是没有办法配成想要的溶液,因为万一倒错了就没有办法挽回了。因此,小谢到网上下载了一个溶液配置模拟器。模拟器在计算机中构造一种虚拟溶液,然后可以虚拟地向当前虚拟溶液中加入一定浓度、一定体积的这种溶液,模拟器会快速地算出倒入后虚拟溶液的浓度和体积。当然,如果倒错了可以撤销。 模拟器的使用步骤如下: 1)为模拟器设置一个初始体积和浓度 V0、C0%。 2)进行一系列操作,模拟器支持两种操作: P(v,c)操作:表示向当前的虚拟溶液中加入体积为 v 浓度为 c 的溶液; Z 操作:撤销上一步的 P 操作。
input:
第一行两个整数,表示 V0 和 C0,0≤C0≤100; 第二行一个整数 n,表示操作数,n≤10000; 接下来 n 行,每行一条操作,格式为:P_v_c 或 Z。 其中 _ 代表一个空格,当只剩初始溶液的时候,再撤销就没有用了,这时只输出初始的体积和浓度。 任意时刻质量不会超过 2^31 -1。
output:
n 行,每行两个数 Vi,Ci,其中 Vi 为整数,Ci 为实数(保留 5 位小数)。 其中,第 i 行表示第 i 次操作以后的溶液体积和浓度。
sample input:
100 100
2
P 100 0
Z
sample output:
200 50.00000
100 100.00000
例子输入2:
100 100
2
Z
P 100 0
例子输出2:
100 100.00000
200 50.00000
#include <bits/stdc++.h>
using namespace std;
int main()
{
double aqc[10000],c;
int cp=1,n,aqv[10000],v;
char o;
cin>>aqv[0]>>aqc[0];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>o;
if(o=='P')
{
cin>>v>>c;
aqv[cp]=aqv[cp-1]+v;
aqc[cp]=(aqc[cp-1]*aqv[cp-1]+c*v)/aqv[cp];
cp++;
}
else if(cp>1)cp--;
printf("%d %.5f\n",aqv[cp-1],aqc[cp-1]);
}
return 0;
}
题目三:栈-火车编组
Description:
如果一列火车有4列车厢,经过编组后,车厢的编组顺序为3,2,4,1;你知道编组站是如何编组的吗?编组的过程是由若干个进栈,出栈操作构成的。
input:
第1行1个正整数n,n<=100; 第2行n个小于或等于n的正整数,表示有 n节车厢,编号为1,2,3,...n,编组时按照进栈,第2行数据表示列车经过编组后的车厢编号顺序。
output:
一行一个由大写字母A和B构成的字符串,A表示进栈,B表示出栈。表示编组时进栈出栈的操作序列。
sample input:
4
3 2 4 1
sample output:
AAABBABB
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n,base,tmp,lb; //base上一节车厢编号 tmp本节车厢编号 lb前面最大的车厢编号
cin>>n;
for(int i=0;i<n;i++)
{
cin>>tmp;
if(i) //判断是否为第一节车厢
{
if(tmp<base)cout<<"B"; //比上一节车厢编号小直接出栈
else
{
for(int j=0;j<tmp-lb;j++) //比上一节车厢编号大先进栈tmp-lb次
{
cout<<"A";
}
cout<<"B"; //自己出栈
}
}
else
{
lb=base=tmp; //设置上一节车厢编号和最大的车厢编号
for(int j=0;j<base;j++)cout<<"A"; //先把这节车厢前面所有的车厢进栈
cout<<"B"; //自己出栈
}
base=tmp;
if(tmp>lb)lb=tmp;
}
return 0;
}
题目四:栈-洗盘子
Description:
Bessie 和 Canmuu 将联手洗掉N (1<= N <= 10,000) 个脏盘子。 Bessie 洗; Canmuu 来擦干它们. 每个盘子有一个指定的编号,范围1..N. 开始,所有盘子按顺序排列在栈中,1号盘子在顶端,N号盘子在底端. Bessie 会先洗一些盘子,然后放在洗过的盘子栈里(这样原来的顺序颠倒). 然后,或者她洗别的盘子,或者Canmuu 擦干她已经洗好的部分或全部盘子,放在擦干的盘子栈里。 这样直到所有盘子洗完擦干后放置的顺序是什么?
input:
第一行: 一个整数N,表示盘子的数量 以下若干行: 每一行两个整数 ,第一整数为1表示洗盘子,为2表示擦盘子,第二个整数表示数量
output:
共N行:擦干后盘子从顶端到底端的顺序
sample input:
5
1 3
2 2
1 2
2 3
sample output:
1
4
5
2
3
#include <bits/stdc++.h>
using namespace std;
stack <int> dirty,wash,clean;
int main()
{
int n,o,num;
cin>>n;
for(int i=n;i>=1;i--)
{
dirty.push(i);
}
while(cin>>o>>num)
{
if(o==1)
{
while(num--)
{
wash.push(dirty.top());
dirty.pop();
}
}
else
{
while(num--)
{
clean.push(wash.top());
wash.pop();
}
}
}
while(n--)
{
cout<<clean.top()<<endl;
clean.pop();
}
return 0;
}
题目五:栈-括号匹配
Description:
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。 本题的任务是检验一个给定表达式中的括号是否正确匹配。 输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。
input:
一行字符,只含有圆括号和方括号,个数小于 255。
output:
匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。
sample input:
[(])
sample output:
Wrong
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool isMatchingPair(char opening, char closing) {
if (opening == '(' && closing == ')') return true;
if (opening == '[' && closing == ']') return true;
return false;
}
bool isBalancedParentheses(string expr) {
stack<char> s;
for (char c : expr) {
if (c == '('|| c == '[') {
s.push(c);
} else if (c == ')'|| c == ']') {
if (s.empty() || !isMatchingPair(s.top(), c)) {
return false;
}
s.pop();
}
}
return s.empty();
}
int main() {
string expr;
cin>>expr;
if (isBalancedParentheses(expr)) {
cout << "OK" << endl;
} else {
cout << "Wrong" << endl;
}
return 0;
}