题外话----自己孤陋寡闻,不知道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;
}