Description:
程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。
Input:
输入一行字符,个数不超过 100。
Output:
输出一行字符,表示实际有效字符。
Sample Input:
sdfosif@for (ii#=1,#;i<.#=8;i+++#);
Sample Output:
for (i=1;i<=8;i++);
Hint:
例子输入2:1234##
例子输出2:12
Code:
#include
using namespace std;
int main()
{
stack<char>s1;
stack<char>s2;
char str[105]={0};
scanf("%[^\n]",str);
int i;
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]=='@')
{
while(!s1.empty())
s1.pop();
}
else if(str[i]=='#')
{
if(!s1.empty())
s1.pop();
}
else
s1.push(str[i]);
}
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
while(!s2.empty())
{
printf("%c",s2.top());
s2.pop();
}
printf("\n");
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
Hint:
例子输入2:
100 100
2
Z
P 100 0
例子输出2:
100 100.00000
200 50.00000
Code:
#include
using namespace std;
int main()
{
stack <int>v0;
stack <double>c0;
char ch;
int v,n,v1;
double c,c1;
cin >> v >> c ;
v1=v,c1=c;
v0.push(v);
c0.push(c);
cin >> n ;
while(n--)
{
cin >> ch;
if(ch=='P')
{
cin >> v >> c ;
v0.push(v);
c0.push(c);
c1=(c1*v1+v*c)/(v+v1);
v1=v+v1;
printf("%d %.5lf\n",v1,c1);
}
else if(ch=='Z')
{
if(v0.size()>1)
{
c1=(c1*v1-v0.top()*c0.top())/(v1-v0.top());
v1=v1-v0.top();
v0.pop();
c0.pop();
printf("%d %.5lf\n",v1,c1);
}
else
printf("%d %.5lf\n",v1,c1);
}
}
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
例二;
5
1 2 3 4 5
Sample Output:
例一:
AAABBABB
例二:
ABABABABAB
Code:
#include
using namespace std;
int main()
{
stack<int>cx;
int n,i,j;
cin >> n;
int a[100];
for(i=1;i<=n;i++)
cin >> a[i] ;
cx.push(1);
printf("A");
i=1;
j=2;
int x=2*n-1;
while(x--)
{
if(cx.empty())
{
cx.push(j);
printf("A");
j++;
}
else if(cx.top()!=a[i])
{
cx.push(j);
printf("A");
j++;
}
else if(cx.top()==a[i])
{
cx.pop();
printf("B");
i++;
}
}
printf("\n");
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
Code:
#include
using namespace std;
int main()
{
stack<int>panzi_dirty;
stack<int>panzi_wet;
stack<int>panzi_dry;
int i,n,f,panzis;
cin >> n ;
for(i=n;i>0;i--)
panzi_dirty.push(i);
while(cin >> f >> panzis )
{
if(f==1)
{
while(panzis--)
{
panzi_wet.push(panzi_dirty.top());
panzi_dirty.pop();
}
}
else if(f==2)
{
while(panzis--)
{
panzi_dry.push(panzi_wet.top());
panzi_wet.pop();
}
}
if(panzi_dry.size()==n) break;
}
while(!panzi_dry.empty())
{
printf("%d\n",panzi_dry.top());
panzi_dry.pop();
}
return 0;
}
Description:
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
本题的任务是检验一个给定表达式中的括号是否正确匹配。
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。
Input:
一行字符,只含有圆括号和方括号,个数小于 255。
Output:
匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。
Sample Input:
[(])
Sample Output:
Wrong
Code:
#include
using namespace std;
int main()
{
stack<char>kuohao;
char str[260]={0};
cin >> str ;
int n=strlen(str),i;
kuohao.push(str[0]);
for(i=1;i<n;i++)
{
if(kuohao.empty())
kuohao.push(str[i]);
else if(kuohao.top()=='('&&str[i]==')')
kuohao.pop();
else if(kuohao.top()=='['&&str[i]==']')
kuohao.pop();
else
kuohao.push(str[i]);
}
if(kuohao.empty())
printf("OK\n");
else
printf("Wrong");
return 0;
}
Description:
给定一个只包含加法和乘法的算术表达式,请编程计算表达式的值。
Input:
输入仅有一行,为需要计算的表达式。表达式中只包含数字、加法运算符“+”和乘法运算符“”,且没有括号,所有参与运算的数字均为 0~2^31 -1 之间的整数。输入数据保证这一行只有0~9、+、 这 12 种字符。
Output:
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。
Sample Input:
【输入样例 1】
1+13+4
【输入样例 2】
1+12345678901
【输入样例 3】
1+1000000003*1
Sample Output:
【输出样例 1】
8
【输出样例 2】
7891
【输出样例 3】
4
code:
#include
using namespace std;
int main()
{
stack<int>a;
int t,s=0;
char ch='+';
while(ch=='+'||ch=='*')
{
cin >> t ;
t=t%10000;
if(ch=='+')
a.push(t);
else if(ch=='*')
{
t=(a.top()*t)%10000;
a.pop();
a.push(t);
}
ch=getchar();
}
while(!a.empty())
{
s=(s+a.top())%10000;
a.pop();
}
printf("%d\n",s);
return 0;
}