📄 02050811.c
字号:
#include <stdio.h>
#include <string.h>
#define MAXLEN 20
/* 用数组实现堆栈 */
int opnd_top=-1,optr_top=-1;
double opnd_stack[20]; /*数据栈 */
char optr_stack[20]; /*运算符栈*/
/*运算符数*/
char optr[7]={'+', '-' ,'*' ,'/' ,'(' ,')' ,'#'};
/*优先级数组*/
char priority[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
/*出栈函数*/
double pop_nd()
{
double e;
e=opnd_stack[opnd_top--];
return e;
}
char pop_tr()
{
char e;
e=optr_stack[optr_top--];
return e;
}
/*压栈函数*/
void push_nd(double e)
{
opnd_stack[++opnd_top]=e;
}
void push_tr(char e)
{
optr_stack[++optr_top]=e;
}
/*得到栈顶值的函数*/
double gettop_nd()
{
return opnd_stack[opnd_top];
}
char gettop_tr()
{
return optr_stack[optr_top];
}
/*得到某个运算符的在运算符数组的下标,不存在则返回-1*/
int getIndex(char op)
{
int i;
for(i=0;i<7;i++)
if(optr[i]==op) return i;
return -1;
}
/*得到两个符号的优先级*/
char getprior(char optr1,char optr2)
{
int i,j;
i=getIndex(optr1);
j=getIndex(optr2);
if(i==-1 || j==-1)
return ' ';
return priority[i][j];
}
/*根据运算符计算出两个一个数的相应结果*/
double calculate(double a,double b ,char c)
{
double r=0;
switch(c)
{
case '+':
r=a+b;
break;
case '-':
r=a-b;
break;
case '*':
r=a*b;
break;
case '/':
r=a/b;
break;
}
return r;
}
main()
{
char c;
/*首先压入一个'#',好等输入结束符'#'时结束*/
push_tr('#');
printf("input a expression,end with '#':\n");
c=getchar();
while(c!='#' || gettop_tr()!='#')
{
/*是数字则进栈*/
if(c>='0' && c<='9')
{
push_nd((int)(c-'0'));
c=getchar();
}
else
{
switch(getprior(gettop_tr(),c))
{
case '<': /*栈顶元素优先权低,则将新接收来的字符入栈,并接收下一个字符*/
push_tr(c);
c=getchar();
break;
case '=': /*脱括号,并接收下一个字符*/
pop_tr();
c=getchar();
break;
case '>': /*退栈并将运算结果入栈*/
push_nd( calculate(pop_nd(),pop_nd(),pop_tr()) );
break;
}
}
}
printf("the result is: %f\n",pop_nd());
scanf("%c",&c);scanf("%c",&c);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -