您的位置:首页 > 其它

栈的应用实践之中缀表达式转后缀表达式

2014-12-21 12:33 309 查看
1,算法的思路如下:



2,算法的框架如下:



3,这里我们用到了之前我们写的栈,就不再重复写了,它们是

LinkList.h

LinkList.c

LinkStack.h

LinkStack.c

4,写一个工程,实现这个算法(PPro)中的 main.c :

#include <stdio.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)

{

LinkStack* stack = LinkStack_Create();

int i = 0;

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("9+(3-1)*5+8/2");

printf("\n");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: