栈的应用---------有关字符串的输入

来源:互联网 发布:手机淘宝 发文件 编辑:程序博客网 时间:2024/06/05 08:07
题目1108:堆栈的使用             

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:11671

解决:3392

题目描述: 

    堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。

输入:

     对于每组测试数据,第一行是一个正整数 n,0<n<=10000(n=0 结束)。而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。

输出:

    对于每组测试数据,根据其中的命令字符来处理堆栈;并对所有的'A’操作,输出当时栈顶的值,每个占据一行,如果当时栈为空,则输出'E’。当每组测试数据完成后,输出一个空行。

样例输入:
3AP 5A4P 3P 6O A0
样例输出:
E53
来源:
2011年吉林大学计算机研究生机试真题

#include<stdio.h>#include<stack>#include<cstring>using namespace std;int main(){int n;stack<int> ch;while(scanf("%d",&n)!=EOF&&n!=0){// getchar();while(!ch.empty()) ch.pop();while(n--!=0){char c[4];scanf("%s",c);//这里原本是使用gets来读取字符串的,它与scanf的区别就是可以接受空格、TAB等制表符 ,//如果用gets,P操作需要压栈 的数字也会被读入字符串,不如直接用scanf处理来的方便 if(c[0]=='A'){// if(ch.empty()){// printf("go1\n");}// if(!ch.empty()){// printf("go2\n");}if(!ch.empty()){// printf("go!\n");printf("%d\n",ch.top());}elseprintf("E\n");} else if(c[0]=='O'){if(!ch.empty()){ch.pop();}}else if(c[0]=='P'){int a;scanf("%d",&a);// if(c[2]=='5')// printf("ding!\n");// else// printf("%c\n",c[2]);ch.push(a);}}printf("\n");} return 0;}



题目1101:计算表达式

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:7388

解决:2307

题目描述:

对于一个不存在括号的表达式进行计算

输入:

存在多种数据,每组数据一行,表达式不存在空格

输出:

输出结果

样例输入:
6/2+3+3*4
样例输出:
18
来源:
2010年上海交通大学计算机研究生机试真题
#include<stack>#include<cstdio>#include<iostream>using namespace std;stack<int> op;stack<double> in;int mat[][5]={1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,1,1,0,0,};char str[1000];void getE(double &retn,int &i,bool &reto){if(i==0&&op.empty()==true){reto=true;retn=0;return;}if(str[i]==0){reto=true;retn=0;return;}if(str[i]>='0'&&str[i]<='9'){reto=false;}else{reto=true;if(str[i]=='+')retn=1;if(str[i]=='-')retn=2;if(str[i]=='*')retn=3;if(str[i]=='/')retn=4;i++;return;}retn=0;    for(;str[i]<='9'&&str[i]>='0'&&str[i]!=0;i++){    retn*=10;    retn+=str[i]-'0';}double d=1,dd=0;if(str[i]=='.'){i++;   for(;str[i]<='9'&&str[i]>='0';i++){   d/=10;   dd+=(str[i]-'0')*d;   }}    retn+=dd;return;}int main(){while(scanf("%s",str)!=EOF){while(!op.empty()) op.pop();while(!in.empty()) in.pop();double ren;int index=0;bool reop;while(true){getE(ren,index,reop);if(reop==false){in.push(ren);}else{    if(op.empty()==true||mat[(int)ren][op.top()]==1)    op.push(ren);    else{    while(mat[(int)ren][op.top()]==0){    int o;    o=op.top();    op.pop();double b=in.top();in.pop();double a=in.top();in.pop();if(o==1)a=a+b;else if(o==2)a=a-b;else if(o==3)a=a*b;else if(o==4)a=a/b;in.push(a);}    op.push(ren);    }}if(op.size()==2&&op.top()==0)break;}cout<<in.top()<<endl;}return 0;}//1+3/2-1*3