NEFU_2020_1_6_大一寒假训练七(栈)

1624 栈-程序员输入问题

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

1627 栈-溶液模拟器

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

1628 栈-火车编组

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

1629 栈-洗盘子

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

1630 栈-括号匹配

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

1631 栈-表达式求值

Description:
给定一个只包含加法和乘法的算术表达式,请编程计算表达式的值。

Input:
输入仅有一行,为需要计算的表达式。表达式中只包含数字、加法运算符“+”和乘法运算符“”,且没有括号,所有参与运算的数字均为 0~2^31 -1 之间的整数。输入数据保证这一行只有0~9、+、 这 12 种字符。

Output:
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。

Sample Input:
【输入样例 1】
1+13+4
【输入样例 2】
1+1234567890
1
【输入样例 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;
}

你可能感兴趣的:(寒假培训题)