22蓝桥杯训练8
题目一:栈-程序员输入问题
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;
}
cpp

题目二:栈-溶液模拟器
Description:
小谢面对众多溶液却始终无法配制出理想的配方。鉴于此,他不得不借助网络资源找到了一份在线解决方案——这个虚拟实验室能够允许用户选择不同的浓度与体积比例进行混合配置。该系统支持两种基本操作方式:一是P(v,c)操作,即表示向当前混合液中添加v毫升浓度为c%的新液体;二是Z操作,即撤销上一步的操作以避免误操作带来的后果
input:
读取两个整数值作为初始体积V₀和初始浓度C₀(其中₀≤C₀≤100);读取一个整数n(表示最多允许的操作次数),并执行接下来的n条操作指令。每条操作指令由P_v_c或Z组成(其中_代表一个空格)。特别地,在仅有原始溶液的情况下进行撤销操作是没有意义的;此时只需输出原始体积V₀和原始浓度C₀即可。需要注意的是,在任何时刻系统的质量不会超过2³¹-1的限制。
output:
该文本共有两段内容:第一段描述了n组数据的具体情况;第二段说明了每一组数据所代表的具体含义
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;
}
cpp

题目三:栈-火车编组
Description:
假设一列火车共有4节车厢,在完成编排后各节车厢按照3号、2号、4号、1号依次排列;你了解编排站的工作流程吗?该流程主要由一系列进出栈操作构成。
input:
请确定一个正整数n(n\leq 100),并提供一列共n个不大于n的正整数作为输入数据。这些数值将依次表示各节车厢编号,并按顺序反映各节车厢在编组作业区依次进入的过程。
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;
}
cpp

题目四:栈-洗盘子
Description:
Bessie与Canmuu将合作清除N(1≤N≤10,000)个脏盘子。随后由Bessie负责处理一些被洗涤的盘子,并将这些被洗涤的盘子重新插入到已清洗的栈底部(这样原来的顺序颠倒)。接着她要么继续处理其他未被洗涤的盘子,要么由Canmuu负责擦干已经处理过的部分或全部。请问经过这一系列操作后最终放置于两个栈中的所有脏盘按照什么顺序排列?
input:
指定的整数值N代表盘子的总数。以下若干行中每一行都包含两个数值:第一个数字如果是1,则表示要清洗盘子;第二个数字代表该操作的数量。
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;
}
cpp

题目五:栈-括号匹配
Description:
假设一个表达式可以包含圆括号和方括号两种类型的符号,并且这些符号可能以任意方式进行嵌套组合。例如,在这种情况下([()])这样的结构是正确的匹配方式;而像([])()这样的结构也是正确的配对关系。然而,在形式如([])或([)]等情况下,则被认为是不符合规范的操作序列。我们的任务是判断给定的一个字符串中的所有符号是否正确配对,并根据结果输出相应的判断结果。
输入一个仅由圆括号与方括号组成的字符串后端系统将自动分析该字符串中各字符之间的配对关系是否符合规定标准,并基于此返回相应的处理结果。
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;
}
cpp

