中缀表达式转后缀表达式
一.后缀表达式
中缀表达式就是我们平常所用的标准四则运算表达式
例如 " 9 +(3 - 1)× 3 + 10 ÷ 2 "
所有的符号都在运算数字的后面出现就叫做后缀表达式。例如 " 9 3 1 -3*+10 2 / + "
二.将中缀表达式转后缀表达式
1.规则:
从左到右依次遍历表达式的每个数字和符号
(1).若是数字就输出,即成为后缀表达式的一部分。
(2).若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
三.代码实现
static void ClearStack(Stack *st)
{
while(!Empty(st))
{
ElemType value;
Top(st, &value);
printf("%c ", value);
Pop(st);
}
printf("\n");
}
static void DealRightPare(Stack *st)
{
int flag = 0;
while(!Empty(st))
{
ElemType value;
Top(st, &value);
Pop(st);
if(value == '(')
{
flag = 1;
break;
}
printf("%c ", value);
}
if(!flag)
{
printf("Pare is Error\n");
}
}
static void DealAddSub(Stack *st, char ch)
{
while(!Empty(st))
{
ElemType value;
Top(st, &value);
if(value == '(') break;
Pop(st);
printf("%c ", value);
}
Push(st, ch);
}
static void DealMultiDiv(Stack *st, char ch)
{
while(!Empty(st))
{
ElemType value;
Top(st, &value);
if(value == '(' ||
value == '+' ||
value == '-') break;
Pop(st);
printf("%c ", value);
}
Push(st, ch);
}
void InfixToSuffix(char *infix_str)
{
if(infix_str == NULL) return;
Stack st;
InitStack(&st, 10);
// 遍历infix_str字符串
int index = 0;
while(infix_str[index] != '\0')
{
if(infix_str[index] == ' ')
{
index++;
continue;
}
if(isdigit(infix_str[index])) // 判断是数字的情况
{
printf("%c", infix_str[index]);
if(!isdigit(infix_str[index+1]))
{
printf(" ");
}
}
else if(infix_str[index] == '(') // 左括号的情况
{
Push(&st, infix_str[index]);
}
else if(infix_str[index] == ')') // 右括号的情况
{
DealRightPare(&st);
}
else if(infix_str[index] == '+' || infix_str[index] == '-') // + - 符号的情况
{
DealAddSub(&st, infix_str[index]);
}
else if(infix_str[index] == '*' || infix_str[index] == '/') // * /符号的情况
{
DealMultiDiv(&st, infix_str[index]);
}
else
{
printf("Infix String is Error\n");
return;
}
index++;
}
ClearStack(&st);
DestroyStack(&st);
}