22蓝桥杯训练8

文章探讨了程序员如何利用栈数据结构处理输入错误,包括撤销操作、溶液模拟器中的P和Z操作、火车编组算法以及洗盘子问题和括号匹配检查,展示了栈在解决这些问题中的关键作用。
摘要由CSDN通过智能技术生成

题目一:栈-程序员输入问题

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值