算法训练 表达式计算

题外话----自己孤陋寡闻,不知道c++有栈函数。无赖写了两个类型的栈函数,函数写好了,可是对于表达式中的整数,一位还好处理,可是上了两位的我就不知道该怎样转换成整型了忘了atoi函数,浪费了好多时间(自己太渣了)。最后看了http://blog.csdn.net/qq_36238595/article/details/54730341的博客豁然开朗。只要熟悉栈,知道atoi函数,这题处理起来就没什么问题.

**题目**
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运。过程都在int内进行。

注释应该写的很清楚了,看着应该没什么大问题,如果对switch函数体里面为什么要先进行函数调用再进行符号入栈操作,自己可以在编译器上调试。就明白了。

主函数开头,stack_ch.push('(')这步操作为什么需要?

前面说main函数里面switch是先调用函数在入栈。在aas和mad函数中,有一个while循环,循环就得有条件。条件是有stack_ch栈弹出一个元素给的。如果刚开始不入一个‘(’会造成空栈,程序异常退出。

#include<iostream>
#include<cstdlib>
#include<string.h>
#include<stack>
using namespace std;
stack<char>stack_ch;//构造字符栈
stack<int>stack_in;//构造数字栈
char str[5000];//输入的表达式,长度定义足够长 
void aas(){
	int num1;
	int num2;
	while(stack_ch.top()!='('){//如果左是括号就不能进行运算操作 ,//考虑这里为什么是不等于'('; 
		num1=stack_in.top();//弹出栈顶元素 
		stack_in.pop();//删除栈顶元素
		num2=stack_in.top();
		stack_in.pop();
		switch(stack_ch.top()){
			case '+':num2+=num1;break;
			case '-':num2-=num1;break;
			case '*':num2*=num1;break;
			case '/':num2/=num1;break;
		}
		stack_ch.pop();//弹出操作符号
		stack_in.push(num2);//将新值压入整型栈中 
	}
}
void mad(){
	int num1;
	int num2;
	while(stack_ch.top()=='*' || stack_ch.top()=='/'){//思考这里的while循环条件和aas函数中的while循环条件不同 
		num1=stack_in.top();
		stack_in.pop();
		num2=stack_in.top();
		stack_in.pop();
		switch(stack_ch.top()){
			case '*':num2*=num1;break;
			case '/':num2/=num1;break;
		}
		stack_ch.pop();//删除操作符
		stack_in.push(num2); 
	}  
}
int main(void){
	int i,j,k=0,length,Num;
	char number[101];
	char s[]=".";
	gets(str);
	strcat(str,s); //链接字符串
	length=strlen(str);
	stack_ch.push('(');
	for(i=0;i<length;i++){
		if(str[i]>='0' && str[i]<='9'){
			number[k++]=str[i];
			continue;//如果是连续的则将值连续压入 
		}
		number[k]='\0';
		if(number[0]!='\0'){
			Num=atoi(number);//将字符数组转换为整数
			stack_in.push(Num);//将整数压入整型栈中
			number[0]='\0';
		}
		k=0;
		switch(str[i]){
			case '+':
				aas();//调用加减函数 ,如果先进行压栈操作,如果像1+2这样的式子加号压进去怎样进行计算? 
				stack_ch.push('+'); 
				break;
			case '-':
				aas();
				stack_ch.push('-');
				break;
			case '*':
				mad();//调用乘除函数 
				stack_ch.push('*');
				break;
			case '/':
				mad();
				stack_ch.push('/');
				break;
			case '(':
				stack_ch.push('(');
				break;
			case ')':
				aas();//调用加减函数,因为不确定括号里面的表达式,所以这里加减函数里面包括乘除
				stack_ch.pop();//右括号不必入栈此时操作的是括号里面的数,操作完毕弹出左括号 
				break;
			case '.':
				aas();//比如计算 1+2 .的作用就是给程序说我需要最后的结果 
				stack_ch.pop();//弹出字符栈的元素 
				break; 
		}
		
	}
	printf("%d\n",stack_in.top());//输出栈顶元素 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值