逆波兰表达式优势在于只需简单操作,入栈和出栈就可以搞定任何普通表达式的运算。
下面是代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//对于表达式(56-20)/(4+2),其后缀表达式为56#20#-4##2#+/
#
typedef struct {
char data[100];
int top;
}SqStack;
void push(SqStack* ptr, char data)
{
ptr->data[++ptr->top] = data;
}
char GetTop(SqStack* ptr)
{
return ptr->data[ptr->top];
}
void pop(SqStack* ptr)
{
ptr->top--;
}
void trans(char* exp, char postexp[])
{
char ch;
int i = -1;
SqStack ptr;
ptr.top = -1;
while (*exp != '\0')
{
switch (*exp)
{
case'(':
push(&ptr, *exp);
exp++;
break;
case')':
while (ptr.data[ptr.top]!= '(')
{
ch=GetTop(&ptr);
pop(&ptr);
postexp[++i]=ch;//当遇到)时,所有的算法符号都要入后缀表达式了,这时也不用担心数字
}
pop(&ptr);
exp++;
break;
case '+':
case '-':
while (ptr.top != -1)
{
ch = GetTop(&ptr);
if (ch != '(')
{
postexp[++i] = ch;
pop(&ptr);
ch = GetTop(&ptr);
}
else
{
break;
}
}
push(&ptr, *exp);
exp++;
break;
case'*':
case'/':
while (ptr.top != -1)
{
ch=GetTop(&ptr);
if(ch=='*'||ch=='/')
{
postexp[++i] = ch;
pop(&ptr);
ch = GetTop(&ptr);
}
else
{
break;
}
}
push(&ptr, *exp);
exp++;
break;
default:
while (*exp >= '0' && *exp <= '9')
{
postexp[++i] = *exp;
exp++;
}
postexp[++i] = '#';
break;
}
}
while (ptr.top != -1)
{
ch = GetTop(&ptr);
postexp[++i] = ch;
pop(&ptr);
}
postexp[++i] = '\0';
for (int k = 0; k <=strlen(postexp); k++)
{
printf("%c", postexp[k]);
}
}
int main() {
char zhongzhui[100];
char exp[100]="(56-20)/(4+2)";
trans(&exp, zhongzhui);
return 0;
}
对于当前这个运算符号都是入栈操作,因为此时还没拿到关于它的第二个操作数,
所以是不断的对栈顶进行操作,下面是运行结果