栈的应用实践之中缀表达式转后缀表达式
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;
}
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;
}
相关文章推荐
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 线性表的实现与应用--表达式中缀转后缀并求值
- 栈的应用--表达式计算&中缀转后缀
- 栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)
- 数据结构栈Stack之中缀表达式转后缀表达式运算应用
- 栈的应用:中缀表达式转为后缀表达式(c语言实现)
- 栈应用之中缀转后缀表达式(C语言版)
- 栈的应用之中缀表达式转后缀表达式
- 栈的应用—中缀转后缀求表达式值
- 栈的应用实践之计算机执行后缀表达式
- 栈的应用之中缀表达式转后缀
- 栈的应用之中缀表达式转换为后缀表达式
- 栈的应用:中缀和后缀表达式的转换及计算
- 栈的应用 平衡符号 后缀表达式 中缀到后缀的转换
- 栈的应用:中缀表达式转为后缀表达式
- 栈应用之将中缀数值表达式转换成后缀表达式
- (转)前缀、中缀、后缀表达式及转换与应用
- 顺序栈应用-前缀、中缀、后缀表达式
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 栈应用之中缀转后缀表达式计算(C++、JAVA)