C语言编程-逆波兰表达式求值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程-逆波兰表达式求值相关的知识,希望对你有一定的参考价值。

问题:读入一个后缀表达式,利用堆栈来计算该表达式的值,同时要效验后缀表达式是否正确。
要求:1:从键盘中输入一个后缀表达式,该表达式包括加减乘除等操作符,以及正整数作为操作数等。2:用堆栈来实现。
输入输出格式:
输入:在字符界面上输入一个后缀表达式,其中两相邻操作数之间利用空格隔开,以#表示结束。
输出:如果该后缀表达式正确,那么在字符界面上输出其结果,计算结果小数点后面保留两位有效数字,如果不正确,请在字符界面上输出表达式错误提示。
测试用例:输入:2 3 * 1 -#
输出:5

参考技术A 这是个数据结构里常规的题目,我资料里有联系方式。

逆波兰算术表达式 C语言

35 逆波兰算术表达式(选作)
成绩: 5 / 折扣: 0.8
传统的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。 其运算规则如下:

(1) 先计算括号内,后计算括号外;
(2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;
(3) 同一优先级运算,从左向右依次进行。

在这种表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。

波兰科学家卢卡谢维奇(Lukasiewicz)提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成。

例如:
3/5+6的逆波兰表达式为3 5 / 6 +
2*(3+4)的逆波兰表达式为2 3 4 + *

输入:
一个只包含加、减、乘、除和数字的逆波兰表达式

输出:
该表达式的值

//利用栈去处理算术方法,利用后缀表达式去处理,只涉及到“+”“-”“*”“/”“()”

#define MAXSIZE 1000
struct
char data[MAXSIZE];
int top;
op;
struct
float data[MAXSIZE];
int top;
st;
//后缀表达式的建立,关键在于圆括弧和加减乘除的处理问题
void trans(exp,postexp)
char exp[MAXSIZE],postexp[MAXSIZE];


char ch;
int i=0,j=0;
op.top=-1;
ch=exp[i];
i++;

while(ch!='\0')

switch(ch)

case '(':
op.top++;
op.data[op.top]=ch;
break;
case ')':
while(op.data[op.top]!='(')
postexp[j]=op.data[op.top];
j++;
op.top--;

op.top--; //将“(”弹栈
break;
//在这里由于我们是按照从左到右的顺序去计算 因此新得出来的“+”“-”的优先级小于原来在栈里面的优先级
//“*”“/”也是一样的
case '+':
case '-':
while(op.top!=-1&&op.data[op.top]!='(')
postexp[j]=op.data[op.top];
j++;
op.top--;

op.top++;
op.data[op.top]=ch;
break;
case '*':
case '/':
while(op.top!=-1 && op.data[op.top]!='(' && (op.data[op.top]=='*'||op.data[op.top]=='/'))
postexp[j]=op.data[op.top];
j++;
op.top--;

op.top++;
op.data[op.top]=ch;
//break;
case ' ':
break;
default:
while(ch>='0'&&ch<='9')
postexp[j]=ch;
j++;
ch=exp[i];
i++;

i--;
postexp[j]='#';
j++;

ch=exp[i];
i++;

while(op.top!=-1)
postexp[j]=op.data[op.top];
j++;
op.top--;

postexp[j]='\0';


//对表达式进行计算
float compvalue(postexp)
char postexp[MAXSIZE];

char ch;
int k=0;
float d;
st.top=-1;
ch=postexp[k];
k++;
while(ch!='\0')
switch(ch)
case '+':
st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];
st.top--;
break;
case '-':
st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
st.top--;
break;
case '/':
if(st.data[st.top!=0])
st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
st.top--;

else
printf("除数不能为零!@\n");

break;
case '*':
st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];
st.top--;
break;
default:
d=0;
while(ch>='0'&&ch<='9')
d=d*10+ch-'0';
ch=postexp[k];
k++;

st.top++;
st.data[st.top]=d;

ch=postexp[k];
k++;

return st.data[st.top];



int main()
char expo[MAXSIZE],postexpo[MAXSIZE];
int i=0;
//char postexpo[1000];
for(i=0;i<1000;i++)
postexpo[i]='\0';

printf("请输入你要计算的表达式:\n");
scanf("%s",&expo);
trans(expo,postexpo);
printf("你输入的表达式的结果-----:%f",compvalue(postexpo));
return 0;

个人写的程序
参考技术A 我用c语言写的wintc下运行正确
希望对你有帮助
#include<stdio.h>
#include<string.h>
int
nibolan(char
s[])

int
i=0,a,b;
char
*p;
p=s
;
while(*p!='\0')
if(*p=='+')*p=((*(p-2)-48)+(*(p-1)-48))+48;
if(*p=='-')*p=((*(p-2)-48)-(*(p-1)-48))+48;
if(*p=='*')*p=((*(p-2)-48)*(*(p-1)-48))+48;
if(*p=='/')*p=((*(p-2)-48)/(*(p-1)-48))+48;
p++;

p--;
return
(*p)-48;

main()

int
r;
char
a[100];
gets(a);
r=nibolan(a);
printf("%d",r);
getch();
参考技术B #include <stdio.h>
#include <stdlib.h>
typedef struct stack
char c[100];
int top;
int size;
stack;
typedef struct level
char ch;
int l;
level;
void initStack(stack *s)

s->top=-1;
s->size=100;


void pushStack(stack *s,char ch)

s->top++;
if(s->top>=s->size)
printf("已满");
else
s->c[s->top]=ch;

char popStack(stack *s)

char ch;
if(s->top==-1)
printf("已空");
else
ch=s->c[s->top--];
return ch;


int main(int argc, char *argv[])

struct level lev[4];
struct stack s;
lev[0].ch='+';
lev[0].l=1;
lev[1].ch='-';
lev[1].l=1;
lev[2].ch='*';
lev[2].l=2;
lev[3].ch='/';
lev[3].l=2;
initStack(&s);
int i=0,j=0;
char a[100],newa[100];
scanf("%s",a);
while(a[i]!='#')

if(a[i]>='0'&&a[i]<='9')
newa[j]=a[i];
j++;

else if(a[i]=='(')
pushStack(&s,a[i]);
else if(a[i]==')')

char ch=popStack(&s);
while(ch!='(')

newa[j]=ch;
j++;
ch=popStack(&s);



else

int x;
int stackVar,arrayVar;
do
stackVar=0;
arrayVar=0;
for(x=0;x<4;x++)
if(lev[x].ch==a[i])
arrayVar=lev[x].l;
if(lev[x].ch==s.c[s.top])
stackVar=lev[x].l;

if(arrayVar<=stackVar)
newa[j]=popStack(&s);j++;
else
pushStack(&s,a[i]);
while(arrayVar<=stackVar);

i++;

while(s.top!=-1)
newa[j]=popStack(&s);j++;
int y;
for(y=0;y<j;y++)
printf("%c",newa[y]);
system("PAUSE");
return 0;

以上是关于C语言编程-逆波兰表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

逆波兰表达式求值424

逆波兰表达式求值(leetcode 150)

逆波兰表达式求值(leetcode 150)

leetcode——150. 逆波兰表达式求值

LeetCode 0150. 逆波兰表达式求值

逆波兰表达式求值