今天資料結構上機遇到了這道題,寫完了,記錄一下。
參考了大神的部落格:鏈結,主要是看了他的思想,實現完全是自己寫的,這裡說說實現思想吧:
前提:求解需要兩個棧,乙個存運算元,乙個存符號。程式注釋很詳細,看程式就能看懂。中心思想:遇到符號保證棧頂優先順序小於此符號,滿足後將其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入棧...