?? lijiting 060810101.cpp
字號:
#include <iostream.h>
#include <malloc.h>
#include <stdio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define OVERFLOW 0
typedef int Status;
typedef double SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S) //構造一個空棧
{
S.base = ( SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType) );
if(!S.base) return OVERFLOW;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S,SElemType e)//入棧操作
{
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)//出棧操作
{
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
double GetTop(SqStack S)//取棧頂元素
{
if(S.base==S.top) return 0;
SElemType e=*(S.top-1);
return e;
}
int In(char c)//判斷是不是運算數
{
if(c<='9'&&c>='0'||c=='.') return 0;
else return 1;
}
char Precede(char a,char c)//判斷運算符的優先關系
{
char b[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='};
int i,j;
switch(a){
case '+' : i=0;break;
case '-' : i=1;break;
case '*' : i=2;break;
case '/' : i=3;break;
case '(' : i=4;break;
case ')' : i=5;break;
case '=' : i=6;break;}
switch(c){
case '+' : j=0;break;
case '-' : j=1;break;
case '*' : j=2;break;
case '/' : j=3;break;
case '(' : j=4;break;
case ')' : j=5;break;
case '=' : j=6;break;}
return b[i][j];
}
double operate (double a,double theta,double b)//計算表達式
{ //a-=48,b-=48; //ascll碼變為數字
int theta1=theta;
switch(theta1){
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
default : return 0;
}//switch
}
double EvaluateExpress()
{ SqStack OPTR,OPND;
InitStack(OPTR);
Push(OPTR, '=');
InitStack(OPND);
cout<<"輸入整個表達式,以=號鍵結束"<<endl;
double x,a,b;
double theta;
char c=getchar();
while(c!='='|| GetTop(OPTR)!='='){
if(!In(c)) {
double d=c-48,dian=0; //化為10進制
for( c=getchar();In(c)==0;c=getchar())/*讀入數字序列*/
if(c=='.')
{dian=1;}
else
{d=10*d+c-48;dian=dian*10.;}
if(dian!=0.)d=d/dian;
Push(OPND,d);
} //c為運算數,先化ASCll碼為十進制數,再入OPND棧,
//if(In(c))//不能只用一個else,否則發生錯誤
switch(Precede(GetTop(OPTR),c)){
case '<':
Push(OPTR, c);c=getchar(); //棧頂元素優先?
break;
case '=':
Pop(OPTR, x); c=getchar(); //脫括號并接受下一個字符
break;
case '>': //退棧并將運算結果入棧
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,operate(a,theta,b));
break;
case ' ':
return ERROR;
}//switch
}//while
return GetTop(OPND);
}
void main()
{double result;
result=EvaluateExpress();
cout<<"表達式的運算結果是"<<result<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -