Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Example Input
59*684/-3*+#
Example Output
57
Hint
基本操作数都是一位正整数!
code:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERLOAD -2
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}Sqstack;
void InitStack(Sqstack &s)//初始化栈
{
s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s.base)
{
exit(OVERLOAD);
}
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
}
int GetTop(Sqstack s, ElemType &e)
{
if(s.top == s.base) return ERROR;
e = *(s.top-1);
return OK;
}
void Push(Sqstack &s, ElemType e)//入栈
{
if(s.top-s.base>=s.stacksize)
{
s.base = (ElemType*)realloc(s.base, (s.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!s.base) exit(OVERLOAD);
s.top = s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++ = e;
}
int Pop(Sqstack &s, ElemType &e)//出栈,并将元素赋给e
{
if(s.top == s.base) return ERROR;
e = *--s.top;
return OK;
}
int main()
{
Sqstack li;
InitStack(li);
char s[10005];
int i = 0, e1, e2;
scanf("%s", s);
while(s[i]!='#')
{
if(s[i]>='0'&&s[i]<='9')
{
Push(li, s[i]-'0');
}
else
{
if(s[i] == '+')
{
Pop(li, e1);
Pop(li, e2);
Push(li, e1+e2);
}
else if(s[i] == '-')
{
Pop(li, e1);
Pop(li, e2);
Push(li, e2-e1);
}
else if(s[i] == '*')
{
Pop(li, e1);
Pop(li, e2);
Push(li, e1*e2);
}
else if(s[i] == '/')
{
Pop(li, e1);
Pop(li, e2);
Push(li, e2/e1);
}
}
i++;
}
GetTop(li, e1);
printf("%d\n", e1);
}
本文介绍了一种使用栈数据结构来解析和计算后缀表达式的算法实现。通过C语言编程,详细展示了如何逐个处理输入字符,区分数字与运算符进行相应操作,最终输出表达式的计算结果。
1932

被折叠的 条评论
为什么被折叠?



