C++ 栈的应用简单中缀表达式求解
直接使用中缀表达式求解的简单代码,使用到了自带的栈的库函数,直接利用中缀表达式求解的过程是这样:首先要将中缀表达式中的操作符和操作数分开,、创建了两个栈来分别存储操作数和操作符,其次扫描表达式,遇到数字则入操作数栈(这里我写的是只有一位的数字,如果多位则要加入其余判断条件获取完整的数字再填入),遇到操作符,做优先级的判断,如果优先级高于操作符栈顶元素,则入栈,反之,则取出两个操作数计算后,压入操作数栈,再次比较。
基本思想如上所述,这里代码注释尽量详细了,如有bug欢迎友好斧正。
#include <iostream>
#include <stack>
#include <string.h>
using namespace std;
char fix[ 50 ] ;
int judge_level ( char s)
{
switch ( s)
{
case '+' :
return 1 ;
break ;
case '-' :
return 1 ;
break ;
case '*' :
return 2 ;
break ;
case '/' :
return 2 ;
break ;
case '(' :
return 0 ;
break ;
case ')' :
return - 1 ;
break ;
}
}
int tmp_caculate ( char s, int a, int b)
{
switch ( s)
{
case '+' :
return a+ b;
break ;
case '-' :
return a- b;
break ;
case '*' :
return a* b;
break ;
case '/' :
return a/ b;
break ;
}
}
int caculate ( )
{
stack < int > num;
stack < char > op;
for ( int i = 0 ; i< strlen ( fix) ; i++ )
{
if ( isdigit ( fix[ i] ) )
{
num. push ( fix[ i] - 48 ) ;
}
else
{
int tmp = judge_level ( fix[ i] ) ;
if ( op. empty ( ) == true )
{
op. push ( fix[ i] ) ;
}
else
{
int top_t = judge_level ( op. top ( ) ) ;
if ( tmp== 0 )
{
op. push ( fix[ i] ) ;
}
else if ( tmp> top_t)
{
op. push ( fix[ i] ) ;
}
else if ( tmp< top_t| tmp== top_t)
{
char s_op = op. top ( ) ;
op. pop ( ) ;
int num_b = num. top ( ) ;
num. pop ( ) ;
int num_a = num. top ( ) ;
num. pop ( ) ;
int res = tmp_caculate ( s_op, num_a, num_b) ;
num. push ( res) ;
if ( tmp== - 1 )
{
op. pop ( ) ;
}
else
{
i-- ;
}
}
}
}
}
while ( op. empty ( ) == false )
{
char s_op = op. top ( ) ;
op. pop ( ) ;
int num_b = num. top ( ) ;
num. pop ( ) ;
int num_a = num. top ( ) ;
num. pop ( ) ;
int res = tmp_caculate ( s_op, num_a, num_b) ;
num. push ( res) ;
}
return num. top ( ) ;
}
int main ( )
{
cout<< "输入中缀表达式:" ;
cin>> fix;
int res = caculate ( ) ;
cout<< "结果为:" << res;
}