您的位置:首页 > 其它

栈的应用 - 中缀表达式转后缀表达式

2015-07-13 19:44 411 查看
有关栈API详情请参看我的另一篇博文:栈的链式存储 - API实现

实例:

5 + 4=> 5 4 +

1 + 2 * 3 => 1 2 3 * +

8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * +

中缀表达式符合人类的阅读和思维习惯

后缀表达式符合计算机的“运算习惯”

中缀转后缀算法:

遍历中缀表达式中的数字和符号

对于数字:直接输出

对于符号:

左括号:进栈

运算符号:与栈顶符号进行优先级比较

若栈顶符号优先级低:此符合进栈 (默认栈顶若是左括号,左括号优先级最低)

若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈

右括号:将栈顶符号弹出并输出,直到匹配左括号

遍历结束:将栈中的所有符号弹出并输出

中缀转后缀

主要代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "linkstack.h"

int isNumber(char c)
{
return ('0' <= c) && (c <= '9');
}

int isOperator(char c)
{
return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}

int isLeft(char c)
{
return (c == '(');
}

int isRight(char c)
{
return (c == ')');
}

int priority(char c)
{
int ret = 0;

if ((c == '+') || (c == '-'))
{
ret = 1;
}

if ((c == '*') || (c == '/'))
{
ret = 2;
}

return ret;
}

void output(char c)
{
if (c != '\0')
{
printf("%c", c);
}
}

//
void transform(const char* exp)
{
int i = 0;
LinkStack* stack = LinkStack_Create();

while (exp[i] != '\0')
{
if (isNumber(exp[i]))
{
output(exp[i]);
}
else if (isOperator(exp[i]))
{
while (priority(exp[i]) <= priority((char)(int)LinkStack_Top(stack)))
{
output((char)(int)LinkStack_Pop(stack));
}

LinkStack_Push(stack, (void*)(int)exp[i]);
}
else if (isLeft(exp[i]))
{
LinkStack_Push(stack, (void*)(int)exp[i]);
}
else if (isRight(exp[i]))
{
//char c = '\0';
while (!isLeft((char)(int)LinkStack_Top(stack)))
{
output((char)(int)LinkStack_Pop(stack));
}

LinkStack_Pop(stack);
}
else
{
printf("Invalid expression!");
break;
}

i++;
}

while ((LinkStack_Size(stack) > 0) && (exp[i] == '\0'))
{
output((char)(int)LinkStack_Pop(stack));
}

LinkStack_Destroy(stack);
}

int main()
{
transform("8+(3-1)*5");

printf("\n");
system("pause");
return 0;
}
完整工程详情:Github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: