?? 中綴表達(dá)式求值.cpp
字號(hào):
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
//#define maxnum 100;
char num[10];
int op=0;
struct optr//操作符棧定義
{
int top;
char optrc[100];
}OPTR;
struct opnd//操作數(shù)定義
{
double opndc[100];
int top;
}OPND;
char Optr[7][7]=//運(yùn)算符優(yōu)先關(guān)系
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
void InitStackOPTR(optr &OPTR)//初始化運(yùn)算符棧
{
OPTR.top=-1;
}
void InitStackOPND(opnd &OPND)//初始化數(shù)據(jù)棧
{
OPND.top=-1;
}
void PushOPND(opnd &OPND,double a)//數(shù)據(jù)進(jìn)棧
{
OPND.top++;
OPND.opndc[OPND.top]=a;
}
void PushOPTR(optr &OPTR,char r)//操作符進(jìn)棧
{
OPTR.top++;
OPTR.optrc[OPTR.top]=r;
}
int opterdata(char c)//判斷輸入的字符是否為運(yùn)算符
{
switch(c)
{
case '+':return 1;
case '-':return 2;
case '*':return 3;
case '/':return 4;
case '(':return 5;
case ')':return 6;
case '#':return 7;
default:return -1;
}
}
char Precede(char e,char f)//比較優(yōu)先級(jí)
{
return(Optr[opterdata(e)-1][opterdata(f)-1]);
}
double GetTopOPND(opnd &OPND)//獲得運(yùn)算符棧的棧頂元素
{
return(OPND.opndc[OPND.top]);
}
char GetTopOPTR(optr &OPTR)//獲得運(yùn)算數(shù)棧的棧頂元素
{
return(OPTR.optrc[OPTR.top]);
}
char PopOPTR(optr &OPTR)//去掉運(yùn)算符棧頂元素,并返回
{
char x;
x=OPTR.optrc[OPTR.top];
OPTR.top--;
return(x);
}
double PopOPND(opnd &OPND)//去掉運(yùn)算數(shù)棧頂元素,并返回
{
double v;
v=OPND.opndc[OPND.top];
OPND.top--;
return(v);
}
double Operate(double i,char ope,double j)//運(yùn)算
{
if (ope=='+')
return(i+j);
else if(ope=='-')
return(i-j);
else if(ope=='*')
return(i*j);
else if(ope=='/')
return(i/j);
}
double EvaluateExpression()//求值函數(shù)
{
InitStackOPTR(OPTR);
PushOPTR(OPTR,'#');
InitStackOPND(OPND);
char c;
cin>>c;
while(c!='#' || GetTopOPTR(OPTR)!='#')
{
if(opterdata(c)==-1)
{
do
{
num[op]=c; op++;cin>>c;
}while(c>='0'&&c<='9');
PushOPND(OPND,atof(num)); op=0;
for(int h=0;h<10;h++)
num[h]=0;
}
else
{
switch(Precede(GetTopOPTR(OPTR),c))
{
case '<':PushOPTR(OPTR,c); cin>>c;break;
case '=':PopOPTR(OPTR); cin>>c;break;
case '>':PushOPND(OPND,Operate(PopOPND(OPND),PopOPTR(OPTR),PopOPND(OPND)));break;
}
}
}
return(GetTopOPND(OPND));
}
void main()
{
cout<<"請(qǐng)輸入表達(dá)式(以'#'結(jié)束)"<<endl;
cout<<EvaluateExpression()<<endl;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -