/*
Name:infixSuffixConv.c
Copyright: personal
Author: hojor
Date: 10-06-10 21:24
Description: infix convert to suffix
*/
#include<stdio.h>
#include<stdlib.h>
#define STACK_SIZE 20
////~stack start
//stack struct
typedef struct stack{
int top;
int a[STACK_SIZE];
}stack;
//create stack
stack * createStack()
{
stack * s = (stack *)malloc(sizeof(stack));
s->top = -1;
return s;
}
//get the the top value of stack
int getTop(stack * s)
{
return s->a[s->top];
}
//is stack empty?
int isEmpty(stack * s)
{
return s->top == -1;
}
//is stack full?
int isFull(stack * s)
{
return s->top == (STACK_SIZE-1);
}
//pop stack return value
int pop(stack * s)
{
if(!isEmpty(s))
{
return s->a[s->top--];
}
else
{
printf("stack empty!!\n");
return 0;
}
}
//push value x to stack
void push(stack * s,int x)
{
if(!isFull(s))
{
s->a[++s->top] = x;
}
else
{
printf("stack is full!!\n");
}
}
////~
////~infix suffix convert start
//get the level of symbol
int getLevel(char symbol)
{
switch(symbol)
{
case '(':
return 10;
break;
case '*':
case '/':
return 9;
break;
case '+':
case '-':
return 8;
break;
default:
printf("symbol error!!:[%c]\n",symbol);
}
}
//is char symbol??
int isSymbol(char ch)
{
return (ch == '(')||(ch == '*')||(ch == '/') \
||(ch == '-')||(ch == '+')||(ch == ')');
}
//function of convert infix to suffix
void infix_suffix_convert(char * infixStr,char * suffixStr)
{
stack * symStack = createStack();
int iCount = strlen(infixStr),i,flag,j,k,n;
i=j=k=flag=n=0;
for(i=0;i<=iCount;i++)
{
//表达式中读到字符为运算符
if(isSymbol(infixStr[i]))
{
/*符号入栈条件,如果当前读取的符号不是闭合括号,并且栈为空或栈顶
为开括号或栈顶的符号优先级小于当前读取符号则符号入栈*/
if(( isEmpty(symStack) && \
infixStr[i] != ')' )
|| ( (char)getTop(symStack)=='(' && \
infixStr[i] != ')' )
|| ( infixStr[i]!=')' && \
getLevel((char)getTop(symStack)) < getLevel(infixStr[i]) ))
{
push(symStack,infixStr[i]);
}
else if(infixStr[i] == ')')
{/*如果遇到闭合括号,符号出栈,输出,直到开括号出栈为止*/
while((char)getTop(symStack)!='(')
{
sprintf(suffixStr,"%s %c",suffixStr,pop(symStack));
}
pop(symStack);
}
else
{/*如果栈为非空并且栈顶符号优先级大于当前读取的符号则出栈,
输出,直到栈顶符号的优先级小于当前读取的符号为止*/
while(!isEmpty(symStack) &&
(getLevel((char)getTop(symStack)) \
>= getLevel(infixStr[i])) )
{
sprintf(suffixStr,"%s %c",suffixStr,pop(symStack));
}
push(symStack,infixStr[i]);
}
flag=2;
}
else if(infixStr[i]>='0' && infixStr[i]<='9')
{//表达式中读取的字符为数字,输出
if(flag == 2 || flag == 0)
{
sprintf(suffixStr,"%s %d",suffixStr,atoi(&infixStr[i]));
flag = 3;
}
}
else
{
;
}
}
//因数字已经全部输出,故栈内所有符号出栈,输出
while(!isEmpty(symStack))
sprintf(suffixStr,"%s %c",suffixStr,pop(symStack));
}
////~
int main()
{
///---stack test
printf("\n********** stack test ***********\n");
int i,j=0,k=0;
stack * s = createStack();
for(i=0;i<10;i++)
push(s,i);
for(i=0;i<10;i++)
printf("%d ",pop(s));
putchar('\n');
free(s);
///---convert start
printf("\n********* convert start **********\n");
int a = 50;
char * infix="( 177 + 25 ) * 555 + (35 + 655 )";
printf("\n中缀表达式:\n%s\n",infix);
char suffix[100];
memset(suffix,0,sizeof(suffix));
infix_suffix_convert(infix,suffix);
printf("\n后缀表达式:\n%s\n\n",suffix);
system("pause");
return 0;
}