中缀转为后缀并求值_legend

来源:互联网 发布:ubuntu安装完没有引导 编辑:程序博客网 时间:2024/06/09 22:55
中缀表达式->后缀表达式,并求值:


(1)中缀表达式->后缀表达式的方法:
(1.0)定义一个符号栈:存储+,-,*,/,(,)等符号。
(1.1)遇到操作数:直接添加到后缀表达式中;
(1.2)栈为空时遇到运算符:直接入栈;
(1.3)遇到左括号:将其入栈;
(1.4)遇到右括号:执行出栈操作,并将出栈元素加入到后缀中,
直到出栈的是左括号,左括号不加入到后缀中。
(1.5)遇到其他运算符如+,—,*,/:弹出所有优先级大于等于该
运算符的栈顶元素,加入到后缀中;然后该运算符入栈。
(1.6)最终将符号栈中的元素依次出栈。


(2)后缀表达式求值:
(2.1)建一个操作数的 栈:
(2.2)遇到操作数:入栈
(2.3)遇到运算符:出栈两个操作数,然后运算,将运算结果入栈;
(2.4)最终栈中仅有一个数,就是最终结果;
(3)代码实现:


/*
简单的中缀转为后缀,
只能计算10以内的数,支持+,-,*,/,(,)
等运算符。
*/


#include<stdio.h>
#include <stack>
#include<iostream>
#include<string.h>
using namespace std;


bool isOperator(char ch){

char ops[]="+-*/";
/*建表*/
int len=sizeof(ops)/sizeof(ops[0]);


/*查表*/
for(int i=0;i<len;i++){
if(ch==ops[i])
return true;
}


return false;
}


/*比较两个字符的 优先级,
如果op1>op2返回1
如果op1=op2返回0
否则返回-1
*/
int precedence(char op1,char op2){


if(op1=='(')
return -1;


if(op1=='+' || op1=='-'){
if('*'==op2 || '/'==op2 )
{
return -1;
}else {
return 0;
}
}


else if( '*'==op1 || '/'==op1){
if('+'==op2 || '-'==op2){
return 1;
}else {
return 0;
}
}
}


/*
中缀表达式->后缀
*/
void inFix2PostFix(char* inFix,char* postFix){

int j=0;/*后缀表达式数组初始下标为0*/
int len;/*len of infix*/
char c;
stack<char> opeStack;


len=strlen(inFix);


for(int i=0;i<len;i++){
c=inFix[i];


if( '('==c ){
opeStack.push(c);
}
else if( ')'==c ){


while(opeStack.top()!='(' ){


postFix[j++]=opeStack.top();
opeStack.pop();
}
opeStack.pop();/*把'('弹出*/

}else {


if(! isOperator(c) )
opeStack.push(c);/*应该是postFix[j++]=c;*/


else{
/*栈非空,且栈顶运算符的优先级大于当前的运算符*/
while(opeStack.empty()==false && precedence(opeStack.top(),c)>=0){


postFix[j++]=opeStack.top();
opeStack.pop();
}


opeStack.push(c);
/*栈为空,需入栈;当前的运算符比栈顶高时需要入栈。*/
}
}


}


while(opeStack.empty==false){
postFix[j++]=opeStack.top();
opeStack.pop();
}


postFix[j]=0;/*串的结束标识*/


}


/*后缀表达式运算:


遇到操作数,入栈;
遇到运算符,出栈两个数,然后运算,将运算结构再入栈;
栈为操作数的栈:
*/


double postFixVal(char * postFix){

stack<char> stack;
int len=strlen(postFix);
char c;
for(int i=0;i<len;i++){


c=postFix[i];


if(isOperator(c)==false){
stack.push(c-'0');
}else {


char op2,op1;
int val;
op1=stack.top();
stack.pop();
op2=stack.top();
stack.pop();


switch(c){
case '+':
val=op1+op2;break;
case '-':
val=op2-op1;break;
case '*':
val=op1*op2;break;
case '/':
val=op2/op1;break;
}
stack.push(val);
}
}


return stack.top();
}


int main(){

char inFix[30];
char postFix[30];
double val;


while(1){
printf("enter an expression\n");
gets(inFix);


if(strlen(inFix)==0)
continue;


printf("\n infix is %s ",inFix);
inFix2PostFix(inFix,postFix);
printf("\n postFix is %s",postFix);
val=postFixVal(postFix);
printf("\nthe result is %.3f",val);
}


return 0;
}
0 0
原创粉丝点击