從鍵盤輸入一個表示式,試編寫演算法計算表示式的值。
阿新 • • 發佈:2019-01-03
hanshu.h://運算子棧
#include <iostream>
#include <string>
using namespace std;
#include "Status.h"
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
int panduan(string ch)
{
if(ch=="+"||ch=="-"||ch=="*"||ch=="/"||ch=="("||ch==")"||ch=="#")
{
return ERROR;
}
else
{
return OK;
}
}
int InitStack(SqStack &S)
{
S.base = new char[MAXSIZE];
if(!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
void StackTraverse(SqStack S)
{
char *p;
p=S.base;
while(p!=S.top)
{
cout<<*p++<<" ";
}
cout<<endl;
}
int Push(SqStack &S,char e)
{
if(S.top-S.base == S.stacksize)
{
return ERROR;
}
*S.top = e;
S.top++;
return OK;
}
int Pop(SqStack &S,char &e)
{
if(S.top == S.base)
{
return ERROR;
}
S.top--;
e = *S.top;
return OK;
}
char GetTop(SqStack S,char e)
{
if(S.top == S.base)
exit(1);
e = *(--S.top);
return e;
}
char Precede(char e,char c)//優先順序的比較
{
if(e =='#')
{
return '<';
}
else
{
switch(c)
{
case '+':
if(e == '(')
return '<';
else
return '>';
break;
case '-':
if(e == '(')
return '<';
else
return '>';
break;
case '*':
if(e == '*' || e == '/')
return '>';
else
return '<';
break;
case '/':
if(e == '*'||e == '/')
return '>';
else
return '<';
break;
case '(':
return '<';
break;
case ')':
if(e == '(')
return '=';
else
return '>';
break;
default:
cout<<"error1"<<endl;
}
}
}
double yunsuan(double a,char e,double b)
{
switch(e)
{
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
if(b==0)
cout<<"error2"<<endl;
else
return a/b;
break;
}
}
#include <iostream>
#include <string>
using namespace std;
#include "Status.h"
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
int panduan(string ch)
{
if(ch=="+"||ch=="-"||ch=="*"||ch=="/"||ch=="("||ch==")"||ch=="#")
{
return ERROR;
}
else
{
return OK;
}
}
int InitStack(SqStack &S)
{
S.base = new char[MAXSIZE];
if(!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
void StackTraverse(SqStack S)
{
char *p;
p=S.base;
while(p!=S.top)
{
cout<<*p++<<" ";
}
cout<<endl;
}
int Push(SqStack &S,char e)
{
if(S.top-S.base == S.stacksize)
{
return ERROR;
}
*S.top = e;
S.top++;
return OK;
}
int Pop(SqStack &S,char &e)
{
if(S.top == S.base)
{
return ERROR;
}
S.top--;
e = *S.top;
return OK;
}
char GetTop(SqStack S,char e)
{
if(S.top == S.base)
exit(1);
e = *(--S.top);
return e;
}
char Precede(char e,char c)//優先順序的比較
{
if(e =='#')
{
return '<';
}
else
{
switch(c)
{
case '+':
if(e == '(')
return '<';
else
return '>';
break;
case '-':
if(e == '(')
return '<';
else
return '>';
break;
case '*':
if(e == '*' || e == '/')
return '>';
else
return '<';
break;
case '/':
if(e == '*'||e == '/')
return '>';
else
return '<';
break;
case '(':
return '<';
break;
case ')':
if(e == '(')
return '=';
else
return '>';
break;
default:
cout<<"error1"<<endl;
}
}
}
double yunsuan(double a,char e,double b)
{
switch(e)
{
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
if(b==0)
cout<<"error2"<<endl;
else
return a/b;
break;
}
}