复试训练——数据结构——栈的应用

题目1153:括号匹配问题

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:7151

解决:3129

题目描述:

    在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.

输入:

    输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
    注意:cin.getline(str,100)最多只能输入99个字符!

输出:

    对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。

样例输入:

)(rttyy())sss)(

样例输出:

)(rttyy())sss)(
?            ?$

来源:

2010年北京大学计算机研究生机试真题

代码:

#include <stdio.h>
#include <stack>
using namespace std;
stack<int> S;
char str[110];
char ans[110];
int main(){
	while(scanf("%s",str)!=EOF){
		int i;
		for(i=0;str[i]!=0;i++){
			if(str[i]=='('){
				S.push(i);
				ans[i]=' ';
			}else if(str[i]==')'){
				if(S.empty()==false){
					S.pop();
					ans[i]=' ';
					}else{
					 ans[i]='?';
					}
			}
			else ans[i]=' ';
		}
		while(!S.empty()){
			ans[S.top()]='$';
			S.pop();
		}
		ans[i]=0;
		puts(str);
		puts(ans);
	}
	return 0;
}

题目1019:简单计算器

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:8514

解决:3109

题目描述:

    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入:

    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出:

    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例输入:

1 + 2
4 + 2 * 5 - 7 / 11
0

样例输出:

3.00
13.36

来源:

2006年浙江大学计算机及软件工程研究生机试真题

代码:

#include <stdio.h>
#include <stack>
using namespace std;
char str[220];
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,
};
stack<int> op;
stack<double> in;
void getOp(bool &reto ,int &retn,int &i){
	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;
			}else if(str[i]=='-'){
				retn=2;
			}else if(str[i]=='*'){
				retn=3;
			}else if(str[i]=='/'){
				retn=4;
			}
			i+=2;
			return;
	}
	retn=0;
	for(;str[i]!=' '&&str[i]!=0;i++){
		retn*=10;
		retn+=str[i]-'0';
	}
	if(str[i]==' ')
		i++;
	return;
}


int main(){
	while(gets(str)){
		if(str[0]=='0'&&str[1]==0) break;
		bool retop;
		int retnum;
		int idx=0;
		while(!op.empty())  op.pop();
		while(!in.empty())  in.pop();
		while(true){
			getOp(retop,retnum,idx);
			if(retop==false){
				in.push((double)retnum);
			}
			else{
				double tmp;
				if(op.empty()==true||mat[retnum][op.top()]==1){
					op.push(retnum);
				}
				else{
					while(mat[retnum][op.top()]==0){
						int ret=op.top();
						op.pop();
						double b=in.top();
						in.pop();
						double a=in.top();
						in.pop();
						if(ret==1) tmp=a+b;
						else if(ret==2) tmp=a-b;
						else if(ret==3) tmp=a*b;
						else tmp=a/b;
						in.push(tmp);
					}
					op.push(retnum);
				}
			}
			if(op.size()==2&&op.top()==0) break;
		}
		printf("%.2f\n",in.top());
	}
	return 0;
}

 

转载于:https://my.oschina.net/u/1996306/blog/830956

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值