在做中缀表达式转换到后缀表达式的实验的时候,输入的是31*5(三十一乘以五),预期输出是31 5 *(三十一 五 乘号),但是输出成了3 1 5 *,,我想问问,上面的函数在哪里设计出错了呢?如果要修改应该怎么修改,main函数里的内容不允许修改。感谢回答
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100
using namespace std;
// 定义栈结构
typedef struct stack {
int top;
char data[STACK_SIZE];
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack* s) {
return s->top == STACK_SIZE - 1;
}
// 获取栈顶元素
char getTop(Stack* s) {
return s->data[s->top];
}
// 压栈
void push(Stack* s, char x) {
if (isFull(s)) {
printf("Error: Stack is full\n");
exit(-1);
}
s->top++;
s->data[s->top] = x;
}
// 出栈
char pop(Stack* s) {
if (isEmpty(s)) {
printf("Error: Stack is empty\n");
exit(-1);
}
char x = s->data[s->top];
s->top--;
return x;
}
// 判断字符是否是数字
int isDigit(char c) {
return c >= '0' && c <= '9';
}
// 判断字符是否是运算符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 获取运算符优先级
int getPriority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 将中缀表达式转换为后缀表达式
Stack inToPost(char* expression) {
Stack s;
Stack post;
initStack(&s);
initStack(&post);
for (int i = 0; expression[i] != '\0'; i++) {
char c = expression[i];
if (isDigit(c)) { // 如果是数字直接压入后缀栈
push(&post, c);
}
else if (isOperator(c)) { // 如果是运算符
while (!isEmpty(&s) && getPriority(getTop(&s)) >= getPriority(c)) { // 取出优先级更高或相等的运算符
push(&post, pop(&s)); // 将取出的运算符压入后缀栈
}
push(&s, c); // 压入当前运算符
}
else if (c == '(') { // 如果是左括号,直接压入中缀栈
push(&s, c);
}
else if (c == ')') { // 如果是右括号
while (getTop(&s) != '(') { // 取出括号内的所有运算符
push(&post, pop(&s)); // 将取出的运算符压入后缀栈
}
pop(&s); // 弹出左括号
}
}
while (!isEmpty(&s)) { // 将中缀栈剩余的运算符都取出来压入后缀栈
push(&post, pop(&s));
}
return post;
}
// 输出后缀表达式
void print1(Stack s)
{
Stack s1;
initStack(&s1);
while (!isEmpty(&s)) {
push(&s1, pop(&s));
}
while (!isEmpty(&s1)) {
printf("%c ", pop(&s1));
}
}
int main(void) {
char express[80];
gets_s(express);
Stack s = inToPost(express);
print1(s);
return 0;
}
inToPost()一次只处理了一个字符,31被当成两个数分别处理了。你可看看我的这篇文章,链式栈四则运算这个案例有多位数的处理:栈和队列:理解与使用_创意程序员的博客-CSDN博客