c语言实现逆波兰函数 c++逆波兰式

C语言编写逆波兰计算器#includestdio.h
#includestdbool.h
#includestdlib.h
#defineSTACK_SIZE 20
intmake_empty(void);
boolis_empty(void);
boolis_full(void);
voidpush(char );
voidpop(char );
voidstack_overflow(void);
voidstack_underflow(void);
charcontents[STACK_SIZE]= {0},top;
intmain(int argc, char *argv[])
{
char ch='1';
while(ch!='q'){
make_empty();
printf("Enter an RPNexpression:");
do{
scanf(" %c",ch);
if(ch='1'ch='9')
push(ch);
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){
top--;pop(ch);
}
else if(ch=='='){
if((top-1)==0)
pop(ch);
else
printf("Nunber notused!");
break;
}
else if(ch=='\n');
else{
ch='q';break;/*其它情况置为退出标志q*/
}
}
while(ch!='\n');
}
return 0;
}
intmake_empty(void){
/* return top=0;
}
boolis_empty(void){
return top==0;
}
boolis_full(void){
return top==STACK_SIZE;
}
voidpush(char ch){
if(is_full())
stack_overflow();
else
contents[top++]=ch-'0';
}
voidpop(char ch){
if(is_empty())
stack_underflow();
else
switch(ch){
case'+':contents[top-1]+=contents[top];break;
case '-':contents[top-1]-=contents[top];break;
case'*':contents[top-1]*=contents[top];break;
case'/':contents[top-1]/=contents[top];break;
case '=':printf("Value ofexpression:%d\n",(int)contents[0]);break;
}
}
voidstack_overflow(void){
printf("Expression is toocomplex!");
exit(EXIT_FAILURE);
}
voidstack_underflow(void){
printf("Not enough operands inexpression!");
exit(EXIT_FAILURE);
}
C语言求解逆波兰表达式使用栈完成
int add(char s[])
{
【c语言实现逆波兰函数 c++逆波兰式】 int st[100];
char *p;
int top=-1;
int A,B,sum=0;
for(p=s;*p!=0;p++)//进行数值计算
{
switch (*p)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':st[++top]=*p-'0';break;//是数字压入总栈st中
case '+':
case '-':
case '*':
case '/'://是运算符号
A=st[top--];
B=st[top--];//弹出2个数字
switch (*p)
{
case '+':sum=B+A;break;
case '-':sum=B-A;break;
case '*':sum=B*A;break;
case '/': sum=B/A;break;
}
st[++top]=sum;//将结果重新压入栈
break;
}
}
return sum;
}
(C语言中)逆波兰算法(及计算器)逆波兰式子又叫做后缀表达式 。(相对于前缀和中缀 , 但是它俩都破坏了式子本身,所以用后缀)
12+3应该表达为12 3+ 。(实际无空格,为了好看)
先解决一个问题,就是123+会不会认为是1和23或者1和2和3 , 其实是不会的 。一般后缀式都是用栈存储的,你在定义栈的时候里面的elemtype e(当然也可以用别的就是举例),这个elemtype是重命名的int 。scanf或者cin输入的时候,你先输入12,这个就被存在栈的第一空里面(因为是%d嘛),再输入3就被存在第二空里面了 。这个不会混淆 。
逆波兰算法是这么工作的:在后缀式中扫描,可能会扫描到一堆数字,但是这时候如果扫描到了一个运算符(加减乘除等) , 这时候提取运算符并提取运算符前面紧挨着的那两个数字(注意是紧挨) , 然后这两个数字和这一个运算符进行运算 。比如123+,扫描得12 , 扫描得3 , 扫描得+(电脑得到了+这个运算符) , 紧接着取前面紧挨的12和3,进行运算,就是12+3了 。如(2+1) * 3就是21+3* 。扫描得2,扫描得1,扫描得+,ok这时候2+1=3,3入栈 , 重新while扫描 。扫描得3(刚才算出来刚入栈的那个),扫描得3 , 扫描得* , ok这时候3*3=9 。

推荐阅读