四则运算计算器设计
(1)设计过程
1.建立两个空栈,栈 OPND 用于存放数据,OPTR 用于存放运算符,表达式起始符“#”作
为 OPTR 栈底元素。
2.依次读入表达式中的每个字符,若是数据,进 OPND,若是运算符,则与 OPTR 栈顶元素
比较优先级后进行相应操作(优先级为“<”进 OPTR,为“=”即“(”与“)”则脱括号,
为“>”则进行运算,直到进栈),直至整个表达式求值完毕(即 OPTR 只剩两个“#”)。
(2)流程图
(3)优先级比较规则
1.乘除大于加减,乘除同级,加减同级,同级相遇为“>”。
2.“(”与“)”大于括号外运算符,小于括号内运算符,“(”与“)”相遇为“=”
3.“#”优先级最低,双“#”相遇为“<”。
(4)所用函数与部分代码:
void InitStack(SeqStack *&);
void Push(SeqStack*,datatype);
datatype PoP(SeqStack*);
datatype GetTop(SeqStack*);
datatype Precede(datatype,datatype);
datatype Operate(datatype,datatype,datatype);
datatype evaluate();
int main()
{
datatype i;
printf("输入表达式(例如 2*(3+4)#):\n");
i=evaluate();
printf("结果为: \n%d",i);
return 0;
}
datatype Precede(datatype x,datatype y)
{
datatype fh;
if(x=='('&&y==')')
fh='=';
else if((x=='#')||(x!='('&&y=='(')||((x=='+'||x=='-')&&(y=='*'||y=='/'))||(x=='('&&y!=')'))
fh='<';
else fh='>';
return fh;
}
datatype Operate(datatype a,datatype op,datatype b)
{
switch(op)
{
case '*':
return (char)(a*b);
return (char)(a/b);
case '-':
return (char)(a-b);
case '+':
return (char)(a+b);
}
}
完整代码:
#include
#include
#define maxsize 60
typedef char datatype;
typedef struct
{
datatype data[maxsize];
int Top;
}SeqStack;
void InitStack(SeqStack *&);
void Push(SeqStack*,datatype);
datatype PoP(SeqStack*);
datatype GetTop(SeqStack*);
datatype Precede(datatype,datatype);
datatype Operate(datatype,datatype,datatype);
datatype evaluate();
int main()
{
datatype i;
printf("输入表达式(例如 2*(3+4)#):\n");
i=evaluate();
printf("结果为: \n\t%d",i);
return 0;
}
void InitStack(SeqStack*&S)
{
S=(SeqStack*)malloc(sizeof(SeqStack));
S->Top=0;
}
void Push(SeqStack*S,datatype e)
{
if(S->Top>=maxsize-1)
printf("输入数据过多");
else
S->data[++S->Top]=e;
}
datatype Pop(SeqStack*S)
{
return S->data[S->Top--];
}
datatype GetTop(SeqStack*S)
{
return S->data[S->Top];
}
datatype Precede(datatype x,datatype y)
{
datatype fh;
if(x=='('&&y==')')
fh='=';
/* else if(y=='#'&&x!='#')
fh='>';*/
else if((x=='#')||(x!='('&&y=='(')||((x=='+'||x=='-')&&(y=='*'||y=='/'))||(x=='('&&y!=')'))
fh='<';
else fh='>';
return fh;
}
datatype Operate(datatype a,datatype op,datatype b)
{
switch(op)
{
case '*':
return (char)(a*b);
case '/':
return (char)(a/b);
case '-':
return (char)(a-b);
case '+':
return (char)(a+b);
}
}
datatype evaluate()
{
SeqStack*OPTR;
SeqStack*OPND;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'#');
datatype ch,x,a,b,op;
while(ch=getchar())
{
if(GetTop(OPTR)==OPTR->data[OPTR->Top-1])
break;
if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='('&&ch!=')'&&ch!='#')
ch=ch-48;
Push(OPND,ch);
{
}
else
label:switch(Precede(GetTop(OPTR),ch))
{
case '<':
Push(OPTR,ch);
break;
case '=':
x=Pop(OPTR);break;
case '>':
op=Pop(OPTR);
b=Pop(OPND);
a=Pop(OPND);
Push(OPND,Operate(a,op,b));
goto label;
break;
}
}
return GetTop(OPND);
}
(5)运行结果