中綴表達式轉後綴表達式的棧實現

/*
  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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章