用棧直接求中綴表示式的值 資料結構之棧的應用

2021-09-02 05:29:03 字數 1294 閱讀 4410

今天資料結構上機遇到了這道題,寫完了,記錄一下。

參考了大神的部落格:鏈結,主要是看了他的思想,實現完全是自己寫的,這裡說說實現思想吧:

前提:求解需要兩個棧,乙個存運算元,乙個存符號。

中心思想:遇到符號保證棧頂優先順序小於此符號,滿足後將其push到符號棧中處理完符號棧即可。

1、對於數字,直接push,我處理數字的方法是遇到數字直接把數字一位一位的放到乙個string裡,然後轉換成數字。

還有負數的處理,需要在遇到符號時判斷,符號前面是

2、對於左括號,直接push到符號棧。

3、對於右括號,處理符號棧中符號,直到遇到左括號。

4、對於加減,需要處理到(  左括號。

5、對於乘除,處理到+ - 或( 左括號

6、對於負數,判斷是負數之後設乙個flag,把轉換出來的數字直接乘-1即可。

遵循這個規則,處理到符號棧空即可。

程式注釋很詳細,看程式就能看懂。

#include #include #include #include #include using namespace std;

double cal(char oper,double lv,double rv)

else if(oper=='-')

else if(oper=='*')

else

else if(in=='.'||in=='+'||in=='-'||in=='*'||in=='/'||in=='('||in==')')

else

}int main()

i--;//這是因為while最後還有乙個i++這樣就不會跳過去乙個了

num=stod(temp)*(flag==1? -1:1);//若轉換出錯,就會結束程式

ans.push(num);//將數字push到運算數棧中

} if(exp[i]=='+'||exp[i]=='-')

else

oper.push(exp[i]);//push當前的運算子

}} if(exp[i]=='*'||exp[i]=='/')

else

oper.push(exp[i]);

}} if(exp[i]=='(')

if(exp[i]==')')

oper.pop();

} i++;

} if(oper.size())

} printf("%lf\n",ans.top());//輸出結果

return 0;

}

直接利用中綴表示式求算術表示式的值 C

本文可以說是對w3eval表示式求值這篇文章的翻譯簡化版本,不詳細說了直接上 找出第乙個閉括號 public int pos first closed parenthesis arraylist list return 1 public string count arraylist list els...

中綴表示式轉字尾表示式 求表示式的值

中綴轉字尾需要遵守以下規則 1 運算元 直接輸出 2 直接入棧 3 將 以前的直接輸出,並將 出棧 不輸出 4 運算子 將優先順序不小於該運算子的操作符出棧,最後將該運算子入棧 5 最後將棧中的元素依次彈出 6 優先順序 大於 大於 class intosuf if op i equals if o...

中綴表示式轉字尾表示式 求字尾表示式值

中綴表示式轉字尾表示式 佇列q和棧s q存放字尾表示式結果 s存放操作符 設棧頂元素top 當前讀取元素a 演算法如果s是空棧 a入棧非空棧 a不是操作符,a插入佇列q 如果a為 a入棧 否則,如果a為 把棧內操作符出棧依次插入佇列q,直至遇到得 元素出棧為止 否則,如果a優先順序大於top,a入棧...