栈的应用

例题一:括号匹配问题

解题思路

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

例题二:

#include<stack>
#include<stdio.h>
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,
};
//优先级矩阵 若mat[i][j]==1表示i号运算符优先级大于j
//+为1号 -为2号 *为3号 /为4号
//我们人为添加在表达式首尾的标记运算符为0号
stack<int> op;//运算符栈
stack<double> in;//数字栈
void getop(bool &reto,int &retn,int &i){
	//获得表达式中下一个元素
	//若reto为true 表示该元素为一个运算符 其编号保存在retn中
	// 若reto为false 表示该元素是一个数字 其值保存在retn中 
	//i表示遍历到的字符串下标
	if(i==0&&op.empty()==true){
		//若此时遍历字符串第一个字符且运算栈为空 人为添加编号为0的标识字符 
		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());
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值