arithmeticexpression.cpp
来自「数据结构的长数字算术表达式计算算法,包括加减乘除等」· C++ 代码 · 共 161 行
CPP
161 行
#define m 100
#include "stdio.h"
struct stack_optr{char s[m];int top;}optr;/*定义运算符栈*/
void create_optr(struct stack_optr *optr) /*建立运算符栈*/
{
optr->top=-1;
}
int empty_optr(struct stack_optr *optr) /*判别运算符栈是否空*/
{
return optr->top==-1?1:0;
}
int overflow_optr(struct stack_optr *optr) /*别运算符栈是否满*/
{
return optr->top==m-1?1:0;
}
void clear_optr(struct stack_optr *optr) /*清空运算符栈*/
{
optr->top=-1;
}
void push_optr(struct stack_optr *optr,char op) /*运算符入栈*/
{
if(overflow_optr(optr))printf("overflow\n");
else
{
optr->top++;
optr->s[optr->top]=op;
}
}
void pop_optr(struct stack_optr *optr,char *op) /*运算符出栈*/
{
if(empty_optr(optr))printf("empty\n");
else
{
*op=optr->s[optr->top];
optr->top--;
}
}
void gettop_optr(struct stack_optr *optr,char *op) /*取运算符栈顶元素*/
{
if(empty_optr(optr))printf("empty\n");
else *op=optr->s[optr->top];
}
struct stack_opnd{int s[m];int top;}opnd; /*定义操作数栈*/
void create_opnd(struct stack_opnd *opnd) /*建立操作数栈*/
{
opnd->top=-1;
}
int empty_opnd(struct stack_opnd *opnd) /*判别操作数栈是否空*/
{
return opnd->top==-1?1:0;
}
int overflow_opnd(struct stack_opnd *opnd) /*判别操作数栈是否满*/
{
return opnd->top==m-1?1:0;
}
void clear_opnd(struct stack_opnd *opnd) /*清空操作数栈*/
{
opnd->top=-1;
}
void push_opnd(struct stack_opnd *opnd,int x) /*操作数入栈*/
{
if(overflow_opnd(opnd))printf("overflow\n");
else
{
opnd->top++;
opnd->s[opnd->top]=x;
}
}
void pop_opnd(struct stack_opnd *opnd,int *y) /*操作数出栈*/
{
if(empty_opnd(opnd))printf("empty\n");
else
{
*y=opnd->s[opnd->top];
opnd->top--;
}
}
void gettop_opnd(struct stack_opnd *opnd,int *y) /*取操作数栈顶元素*/
{
if(empty_opnd(opnd))printf("empty\n");
else *y=opnd->s[opnd->top];
}
int getpriority(char ch)/*取得优先数*/
{
int priority;
switch(ch)
{
case '*':priority= 2;break;
case '/':priority= 2;break;
case '+':priority= 1;break;
case '-':priority= 1;break;
case '#':priority= 0;break;
}
return priority;
}
int isnumber(char ch)/*判别是否为数字*/
{
if(ch<='9'&&ch>='0')return 1;
else return 0;
}
void caculate(int x1,char op,int x2,int *x)/*根据运算符计算*/
{
switch(op)
{
case '*':*x=x1*x2;break;
case '/':*x=x1/x2;break;
case '+':*x=x1+x2;break;
case '-':*x=x1-x2;break;
}
}
int getvalue(char *str)/*计算表达式*/
{
char w,ch,op; /*w用于存放当前字符,ch用于存放当前操作符栈栈顶符号,op用于存放当前运算的符号*/
int index=1,x1,x2,x;/*index当前字符位置,x1操作数一,x2操作数二,x结果*/
create_optr(&optr); create_opnd(&opnd);/*建立操作符栈和操作数栈*/
push_optr(&optr,'#');
w=str[index];/*取当前字符*/
gettop_optr(&optr,&ch);/*取当前操作符栈栈顶符号*/
while(!((w=='#')&&(ch=='#')))/*当没有结束时*/
{
if(isnumber(w))/*是操作数*/
{
x=0;
while(isnumber(w))
{
x=x*10+w-'0';
index++;
w=str[index];
}
push_opnd(&opnd,x);/*将操作数入操作数栈*/
}
else if((x1=getpriority(w))>(x2=getpriority(ch)))/*w优先于ch*/
{
push_optr(&optr,w);/*把w入操作符栈*/
index++;
}
else /*ch优先于w*/
{
pop_optr(&optr,&op);/*操作符*/
pop_opnd(&opnd,&x2);/*操作数2*/
pop_opnd(&opnd,&x1);/*操作数1*/
caculate(x1,op,x2,&x);/*计算*/
push_opnd(&opnd,x);/*把结果入操作数栈*/
}
w=str[index];
gettop_optr(&optr,&ch);
}
pop_opnd(&opnd,&x);
return x;/*返回结果*/
}
void main()
{
char str[m];int x;
printf("please input an expression(start of #,end of #):\n");
scanf("%s",str);
x=getvalue(str);
printf("%d",x);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?