#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "linkstack.h"
int isNumber(char c)
{
return c >= '0' && c <= '9';
}
int isOperator(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/';
}
int isLeft(char c)
{
return c == '(' || c == '[' || c == '{' || c == '<';
}
int isRight(char c)
{
return c == ')' || c == ']' || c == '}' || c == '>';
}
int Priority(char c)
{
switch (c)
{
case '+':
case '-':
return 1;
break;
case '*':
case '/':
return 2;
break;
default:
return 0;
}
}
void outPut(char c)
{
printf("%c", c);
}
void transform(char *c)
{
int i = 0;
LinkStack *stack = LinkStack_Create();
while (c[i] != '\0')
{
if (isNumber(c[i]))
{
outPut(c[i]);//若是数字,直接打印
}
else if (isOperator(c[i]))//若是符号:
{
while (Priority(c[i]) <= Priority((char)(int)LinkStack_Top(stack)))//若符号优先级小于栈顶符号优先级
{
outPut((char)(int)LinkStack_Pop(stack));//则弹出栈顶元素
}
LinkStack_Push(stack, (void *)(int)c[i]);//若符号优先级大于栈顶优先级则入栈
}
else if (isLeft(c[i]))//若是左括号,则入栈
{
LinkStack_Push(stack, (void *)(int)c[i]);
}
else if (isRight(c[i]))//若是右括号,则弹出栈顶元素直到弹出左括号
{
while (!isLeft((char)(int)LinkStack_Top(stack)))
{
outPut((char)(int)LinkStack_Pop(stack));
}
LinkStack_Pop(stack);
}
else
{
printf("invalid express\n");
break;
}
i++;
}
while ((LinkStack_Size(stack)) > 0 && (c[i] == '\0'))//遍历结束:将栈中的所有符号弹出并输出
{
outPut((char)(int)LinkStack_Pop(stack));
}
LinkStack_Destroy(stack);
}
int main()
{
transform("8+(3-1)*5");
printf("\n");
system("pause");
return 0;
}
栈的应用之中缀转后缀
最新推荐文章于 2024-04-06 01:34:32 发布