题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入 #1复制
3.5.2.-*7.+@
输出 #1复制
16
说明/提示
字符串长度,1000内。
本人链表模拟栈的练习代码:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct StackNode;
typedef struct StackNode{
long long data;
StackNode *next;
}StackNode;
typedef struct{
StackNode *top;
int count; //元素个数
}LinkStack;
void Push(LinkStack *s, long long c){
StackNode *p = (StackNode *)malloc(sizeof(StackNode));
p->data = c;
p->next = s->top; //p存放下面的元素
s->top = p;
s->count++;
}
void Pop(LinkStack *s){
StackNode *p = s->top;
s->top = p->next;
free(p);
s->count--;
}
int main(){
LinkStack L;
LinkStack *s = &L;
char op;
int now = 0;
while((op = getchar()) != '@'){
if(isdigit(op)){
now *= 10;
now += op - '0';
}
else if(op == '.'){
Push(s, now);
now = 0;
}
else if(op == '+'){
s->top->next->data = s->top->next->data + s->top->data;
Pop(s);
}
else if(op == '-'){
s->top->next->data = s->top->next->data - s->top->data;
Pop(s);
}
else if(op == '*'){
s->top->next->data = s->top->next->data * s->top->data;
Pop(s);
}
else if(op == '/'){
s->top->next->data = s->top->next->data / s->top->data;
Pop(s);
}
}
printf("%lld", s->top->data);
return 0;
}