1. 程式人生 > >使用c語言實現字尾表示式計算器

使用c語言實現字尾表示式計算器

使用棧來進行字尾表示式計算,流程:從前向後讀取字尾表示式的專案,遇到數值壓入棧中,遇到運算子pop出棧頂的兩項做運算,運算結果再放入棧中直到=

例子:求字尾表示式4x*2x*a-c*+=?

1.把4和x壓入棧中接下來遇到了運算子*把4和x取出做*運算得到4x放入棧中,此時棧中有4x

2.接下來2和x放入棧中遇到了運算子*把2和x取出做*運算得到2x放入棧中,此時棧中有4x,2x

3.接下來遇到了a把a入棧,棧裡專案為4x,2x,a,遇到預算符-,取出2x和a做-運算得到2x-a再放入棧,此時棧裡是4x,2x-a

4.接下來把c壓入棧,棧裡專案為4x,2x-a,c,遇到預算符*,取出2x-a和c,*運算得到(2x-a)c,再入棧,此時棧裡是4x,(2x-a)c

5.最後遇到+運算子,把棧中4x,(2x-a)c做+運算得到最終結果4x+(2x-a)c

以上就是運用棧求字尾表示式的流暢,下面我們來用程式碼實現它:

(程式碼來源:http://blog.csdn.net/woshinannan741/article/details/50087665)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <string>
#include <stack>
#include<algorithm>
#define MAXN 1000
using namespace std;
stack<char> s;  //定義了一個棧


char *tranfExp(char* exp)
{
    char tempStr[1000];//儲存字尾表示式的字串


    int i=0,j=0;
    while(exp[i] !='\0')
    {
        if(exp[i]>='0' &&exp[i]<='9')  //如果是數字字串就儲存到字尾表示式字串中
        {
            tempStr[j++] = exp[i];
        }
        else if(exp[i] == '(' )  //如果是左括號及入棧
        {
            s.push(exp[i]);
        }
        else if(exp[i] == ')' )  //如果是右括號就把接近棧頂的左括號上面所有的運算子出棧存進字串中  左括號出棧
        {
            while(s.empty() == false)
            {
                if(s.top() == '(' )
                {
                    s.pop();
                    break;
                }
                else
                {
                   tempStr[j++] = s.top();
                   s.pop();
                }
            }
        }
        else if(exp[i] == '+' || exp[i] == '-')   //如果的事+-|操作符就把比他優先順序高或者等於的所有運算子出棧進入字串
        {
            while(s.empty() == false)
            {
                char ch = s.top();
                if(ch == '+'||ch == '-'||ch == '/'||ch == '*')
                {


                   tempStr[j++] = s.top();
                   s.pop();
                }
                else
                    break;
            }
            s.push(exp[i]);
        }
        else if(exp[i] == '*' || exp[i] == '/')  //類似於掃描到+- 只是如果棧中有=-運算子就不用出棧  因為運算子優先順序比較小
        {
            while(s.empty() == false)
            {
                char ch = s.top();
                if(ch == '/' || ch=='*')
                {
                    tempStr[j++] = s.top();
                   s.pop();
                }
                else
                    break;
            }
            s.push(exp[i]);
        }
        i++;
    }
    while(s.empty() == false)   //把棧中剩餘的所有運算子出棧
    {
        tempStr[j++] = s.top();
        s.pop();
    }
    tempStr[j] = 0;   //最後一個賦值為0  也就是字串結束的標誌
    return tempStr;   //返回已經得到的字尾表示式
}
int calcExp(char* exp)// 計算字尾表示式
{
    puts(exp);   //展示已經得到的字尾
    while( !s.empty() )
      s.pop();
    int i=0;
    while(exp[i] != '\0')
    {
        if(exp[i]>='0' && exp[i]<='9')
        {
            s.push(exp[i]-'0');
        }
        else if(exp[i] == '-')
        {
            int m = s.top();
            s.pop();
            int n = s.top();
            s.pop();
            s.push(n-m);
        }
        else if(exp[i] == '+')
        {
            int m = s.top();
            s.pop();
            int n = s.top();
            s.pop();
            s.push(n+m);
        }
        else if(exp[i] == '/')
        {
            int m = s.top();
            s.pop();
            int n = s.top();
            s.pop();
            s.push(n/m);
        }
        else if(exp[i] == '*')
        {
            int m = s.top();
            s.pop();
            int n = s.top();
            s.pop();
            s.push(n*m);
        }
        i++;
    }
  /* while(s.empty() == false)
    {
         printf("%d",s.top());
         s.pop();
    }*/
    printf("\n\n\n");
    return s.top();
}
int main()
{
   char str[1000];
   char* tranStr;
   tranStr = (char *)malloc(100*sizeof(char));
   printf("please input expression with kuohao:\n");
  // scanf("%s",str);
   str='2*(3+2)-5*2';
   tranStr =  tranfExp(str);//中綴表示式轉換為字尾表示式函式
   //puts(tranStr); //輸出轉換後的字尾表示式
   printf("%d",calcExp(tranStr));
   return 0;
}