问题描述
中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式
(A 一 (B*C 十 D)*E) / (F 十 G )
转换为后缀表示为:
ABC*D十E*--FG十/
注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。
要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束
输入
整数N。表示下面有N个中缀表达式
N个由单个字母和运算符构成的表达式
输出
N个后缀表达式。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M |
代码如下:
(感觉同一类型实际上每次写都会有很多重复的地方,打算每个结构存一下常用的自定义函数)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct
{
char data[MAX_SIZE];
int top;
} Stack;
void push(Stack *stack, char item)
{
stack->data[++stack->top] = item;
}
char pop(Stack *stack)
{
return stack->data[stack->top--];
}
char peek(Stack *stack)
{
return stack->data[stack->top];
}
int get_Pre(char c)
{
if (c == '^')
return 3;
else if (c == '*' || c == '/')
return 2;
else if (c == '+' || c == '-')
return 1;
else
return 0;
}
char *in_to_post(const char *in)
{
Stack stk = {.top = -1};
char *post = (char *)malloc(MAX_SIZE * sizeof(char));
int post_index = 0;
for (int i = 0; i < strlen(in); i++)
{
char c = in[i];
if (isalpha(c))
post[post_index++] = c;
else if (c == '(' || c == '^')
push(&stk, c);
else if (c == ')')
{
while (peek(&stk) != '(')
post[post_index++] = pop(&stk);
pop(&stk);
}
else if (strchr("+-*/^", c))
{
while (stk.top != -1 && peek(&stk) != '(' && get_Pre(c) <= get_Pre(peek(&stk)))
post[post_index++] = pop(&stk);
push(&stk, c);
}
}
while (stk.top != -1)
post[post_index++] = pop(&stk);
post[post_index] = '\0';
return post;
}
int main()
{
int N;
scanf("%d", &N);
getchar();
for (int i = 0; i < N; i++)
{
char in[MAX_SIZE];
fgets(in, MAX_SIZE, stdin);
in[strcspn(in, "\n")] = '\0';
char *post = in_to_post(in);
printf("%s\n", post);
free(post);
}
return 0;
}