#include <iostream>
using namespace std;
int Digitizing ( char ch ) //字符转换成数字才可在栈中比较
{
switch ( ch )
{
case '+':
return 0;
break;
case '-':
return 1;
break;
case '*':
return 2;
break;
case '/':
return 3;
break;
case '(':
return 4;
break;
case ')':
return 5;
break;
}
}
char Prototype ( int n )//还原输出
{
switch ( n )
{
case 0:
return '+';
break;
case 1:
return '-';
break;
case 2:
return '*';
break;
case 3:
return '/';
break;
case 4:
return '(';
break;
case 5:
return ')';
break;
}
}
string Conversion ( string str )//中缀转换后缀
{
int op[50];
int flag = 0;
int i = 0;
int op_value;
int j = -1;
char ch;
string s;
while ( str[i] != '\0' )
{
ch = str[i];
if ( ( ch >= '0' && ch <= '9' ) || ( ch >= 'A' && ch <= 'Z' ) || ( ch >= 'a' && ch <= 'z' ) )
s += ch;
else if ( 1 )
{
op_value = Digitizing ( ch );
if ( op_value == 4 ) //判断是否为'('
{
op[++j] = op_value;
flag = 1;
}
else if ( op_value == 5 ) //判断是否为')',是的话,输出栈直到遇到'(',完后j递减一次
{
while ( op[j] != 4 )
{
s += Prototype ( op[j--] );
}
j--;
flag = 0;
}
else if ( flag == 1 || op_value / 2 > op[j] / 2 || j == -1 ) //入栈,到这步结束尾要把flag置0,因为操作符栈里为"(*",
{
//假如这时op_value为'+'值,flag还为1的话就要入栈了,所以每次执行到这步flag都要置0
op[++j] = Digitizing ( ch );
flag = 0;
}
else
{
while ( op_value / 2 <= op[j] / 2 && j != -1 && op[j] != 4 ) //出栈
s += Prototype ( op[j--] );
op[++j] = op_value;
}
}
i++;
}
while ( j >= 0 )
s += Prototype ( op[j--] );
return s;
}
int cul ( char ch, int op1, int op2 )
{
switch ( ch )
{
case '+':
return op1 + op2;
break;
case '-':
return op1 - op2;
break;
case '*':
return op1 * op2;
break;
case '/':
return op1 / op2;
break;
}
}
int Calculation ( string str )//后缀计算
{
int op[5];
int i = 0;
char ch;
int j = -1;
while ( str[i] != '\0' )
{
ch = str[i];
if ( ch >= '0' && ch <= '9' )
op[++j] = ch - '0';
else if ( 1 )
{
op[j - 1] = cul ( ch, op[j - 1], op[j] );
j--;
}
i++;
}
return op[0];
}
int main()
{
cout << Conversion ( "1-2+3-1*2" ) << endl;
cout << Calculation ( "12-3+12*-" ) << endl;
return 0;
}
巧妙地利用了除2法,才可以比较运算符之间的大小。
中缀表达式转化为后缀表达式,并计算结果
最新推荐文章于 2021-03-27 15:59:25 发布