1. 程式人生 > >棧的應用--簡單四則運算

棧的應用--簡單四則運算

思想:我們平時輸入的四則運算表示式,例如:9*(3-1)+2,屬於中綴表示式。我們需要將它轉換成字尾表示式:

9 3 1 - * 2 +的形式求值。其中需要兩個棧:數字棧和運算子棧。

過程:

逐個讀取中綴表示式(char型):9*(3-1)+2

1.如果是數字則壓入數字棧(如果是大於一位的數字則需要寫個函式轉換成int型)

2.如果是'('則壓入運算子棧中

3.如果是'+'或者'-',判斷一下運算子的棧頂元素,如果是'*','/','+','-'則出棧,調用出棧函式(利用數字棧和運算子棧算出中間結果),然後將該運算子壓入運算子棧中

4.如果是'*'或者'/',判斷一下運算子的棧頂元素,如果是'*'或者'/',則出棧,調用出棧函式,然後將該運算子壓入運算子棧中

5.如果是'(',則直接調用出棧函式,直到將'('出棧為止

6.遍歷完中綴表示式後,如果此時運算子棧不為空,則調用出棧函式逐個出棧

7.最後的結果是數字棧的棧頂元素

程式碼:

/*--------------------------------------------
--利用棧進行四則運算,將中綴表示式轉換成字尾表示式求值--
--------------------------------------------*/
#include<stdio.h>
#include<math.h>
#define MAXSIZE 30
//出棧函式
void pop(int *num,char *c,int *num_p,int *str_p)
{
    int num1,num2,result=0;
    num1=num[(*num_p)--];
    num2=num[(*num_p)--];
    if(c[*str_p]=='+') result=num1+num2;
    else if(c[*str_p]=='-') result=num2-num1;
    else if(c[*str_p]=='*') result=num1*num2;
    else if(c[*str_p]=='/') result=num2/num1;
    //printf("中間結果:=%d \n",result);
    num[++(*num_p)]=result;
    (*str_p)--;
}
//字元數組裡的數字轉換成int型
void change(int *num,char *all,int *all_p,int *num_p)
{
    int item=*all_p;
    int number1=0;
    while((all[item]-'0')>=0&&(all[item]-'0')<=9)
    {
        number1++;
        item++;
    }
    number1--;
    int result=0;
    while(all[*all_p]-'0'>=0&&all[*all_p]-'0'<=9)
    {
        result=result+pow(10,number1)*(all[*all_p]-'0');
        (*all_p)++;
        number1--;
    }
    (*all_p)--;
    //printf("=%d,",*all_p);
    num[++(*num_p)]=result;
}
int main(void)
{
    //number儲存數字
    int number[MAXSIZE];
    //all_put儲存標準輸入,str儲存運算子號
    char all_put[60],str[MAXSIZE];
    //兩個陣列的棧頂指標
    int num_top,str_top;
    num_top=-1;
    str_top=0;
    str[0]='(';
    char c;
    int i=0;
    while((c=getchar())!='\n')
        all_put[i++]=c;
    int j;
    for(j=0;j<i;j++)
    {
        c=all_put[j];
        //該字元是數字時
        if((c-'0'>=0)&&(c-'0'<=9))
            change(number,all_put,&j,&num_top);
        //該字元是'('
        else if(c=='(')
            str[++str_top]=c;
        //該字元是'+'或'-'
        else if(c=='+'||c=='-')
        {
            if(str[str_top]=='+'||str[str_top]=='-'||str[str_top]=='*'||str[str_top]=='/')
            {
                pop(number,str,&num_top,&str_top);
                str[++str_top]=c;
            }
            else
                str[++str_top]=c;
        }
        //該字元是'*'或者'/'
        else if(c=='*'||c=='/')
        {
            if(str[str_top]=='*'||str[str_top]=='/')
            {
                pop(number,str,&num_top,&str_top);
                str[++str_top]=c;
            }
            else
                str[++str_top]=c;
        }
        //該字元是')'
        else if(c==')')
        {
            pop(number,str,&num_top,&str_top);
            str_top--;
        }
        //printf("字元:%c\n",str[str_top]);
    }
    while(str_top>0)
        pop(number,str,&num_top,&str_top);
    printf("運算結果為:%d\n",number[num_top]);
    return 0;
}