本人脑筋不太灵光,做些题目练练脑子吧。。。。T T
贴上找到的链接。感谢。
http://blog.csdn.net/sunmenggmail/article/details/7888723
核心思想:算数运算符栈中优先级越高的越在栈顶
#include <iostream>
#include <string.h>
#include <stack>
using namespace std;
stack<int> s1,s2;
int compare(char c,char d)
{
int result;
switch(c){
case '^':
switch(d){
case '+' : result = 1; break;
case '-' : result = 1; break;
case '*' : result = 1; break;
case '/' : result = 1; break;
case '^': result = 0; break;
}
case '+':
case '-':
switch(d) {
case '+' : result = 0; break;
case '-' : result = 0; break;
case '*' : result = -1; break;
case '/' : result = -1; break;
case '^': result = -1; break;
}
break;
case '*':
case '/':
switch (d)
{
case '+' : result = 1; break;
case '-' : result = 1; break;
case '*' : result = 0; break;
case '/' : result = 0; break;
case '^': result = -1; break;
}
break;
}
return result;
}
void pop_out(){
char t;
do {
t = s1.top();
s1.pop();
if( t != '(' ) {
s2.push(t);
} else {
break;
}
}while(true);
}
void calc(char op)
{
do {
if( s1.empty() ) break;
char t_op = s1.top();
if( op !='(' && t_op !='(' && compare(op,t_op) < 0 )
{
s1.pop();
s2.push(t_op);
} else {
break;
}
}while(true);
}
int main()
{
char expression[1024];
int n;
scanf("%d",&n);
while(n--){
scanf("%s",expression);
int i = 0;
int ex_len = strlen(expression);
for(i=0;i<ex_len;i++) {
if(expression[i] >='a' && expression[i] <= 'z') {
s2.push(expression[i]);
} else {
switch (expression[i])
{
case '(':
s1.push(expression[i]);
break;
case ')':
pop_out();
break;
default:
calc(expression[i]);
s1.push(expression[i]);
break;
}
}
}
while(!s1.empty()) {
char t = s1.top();
s1.pop();
s2.push(t);
}
i = 0;
while(!s2.empty()) {
expression[i++] = s2.top();
s2.pop();
}
expression[i] = 0;
for(i=strlen(expression)-1;i>=0;i--)
{
printf("%c",expression[i]);
}
printf("\n");
}
return 0;
}