表示式計算 用棧完成
///////////////////////////////
///表示式計算
////資料結構:棧
////作者:ZZJ_4Ever
///////////////////////////////
#include <iostream>
#include <stack>
#include <string>
#include<assert.h>
using namespace std;
stack<double> data_stack;
stack<char> char_stack;
int PRI(char &ch)
{
if(ch==')'){return 1;}
else if(ch=='+'||ch=='-'){return 2;}
else if(ch=='*'||ch=='/'){return 3;}
else return 0;
}
/*
2.掃描到操作符,與操作符棧的頂端操作符進行比較,
如果優先順序小或相等,則彈出資料和操作符進行計算,將結果送入資料棧;
如果優先順序較大,則進操作符棧;
如果是’(‘直接進棧,如果是’)’,遇到’(‘則抵消.
*/
void Exc_stack()
{
double result_temp;
assert(char_stack.size()>=1&&data_stack.size()>=1);
double temp1=data_stack.top();
data_stack.pop();
double temp2=data_stack.top();
data_stack.pop();
char popchar=char_stack.top();
char_stack.pop();
if(popchar=='+')
result_temp=temp2+temp1;
else if(popchar=='-')
result_temp=temp2-temp1;
else if(popchar=='*')
result_temp=temp2*temp1;
else if(popchar=='/')
result_temp=temp2/temp1;
data_stack.push(result_temp);
}
void push_charinto(char &ch)
{
if(ch=='(')//如果是’(‘直接進棧
char_stack.push(ch);
else if(char_stack.empty())
{
char_stack.push(ch);
}
else if(PRI(ch)>PRI(char_stack.top()))//如果優先順序較大,則進操作符棧
{
char_stack.push(ch);
}
//掃描到操作符
else//如果優先順序小或相等,則彈出資料和操作符進行計算,將結果送入資料棧
{
Exc_stack();
if(ch==')')//如果是’)’,遇’(‘直接彈出.
{
while(char_stack.top()!='(')//操作括號內的內容直到遇到'('為止
{
Exc_stack();
}
char_stack.pop();
}
else
//將自己壓入棧
char_stack.push(ch);
}
}
void push_datainto(double &db)
{
data_stack.push(db);
}
void main()
{
string str;
while(1)
{
bool flag=false;
double ret = 0.0;
double n ;
cout<<"在此輸入表示式:";
//讀 入
cin>>str;
//處理
//篩選
////////////////////////
/////開始掃描
///////////////////////
for(int i=0;i<str.length();i++)
{
if(str[i]>='0' && str[i]<='9')
{
if(!flag)
ret = ret *10 + str[i]-'0';
else
{
ret = ret + (str[i]-'0')/n;
n*=10;
}
}
else if(str[i] == '.')
{
n = 10;
flag = true;
}
else
{
if(ret!=0 || str[i-1]=='0')
push_datainto(ret);
ret=0.0;
flag = false;
push_charinto(str[i]);
}
}
//如果最後一個數字還沒有壓入棧
if(ret!=0||str[i-1]=='0')push_datainto(ret);
//3.掃描資料完成後,依次退棧並進行計算
assert(!data_stack.empty()||!char_stack.empty());
while(data_stack.size()!=1)
{
Exc_stack();
}
// double rre=data_stack.top();
cout<<"結果:"<<data_stack.top()<<endl;
data_stack.pop();
}
}
///表示式計算
////資料結構:棧
////作者:ZZJ_4Ever
///////////////////////////////
#include <iostream>
#include <stack>
#include <string>
#include<assert.h>
using namespace std;
stack<double> data_stack;
stack<char> char_stack;
int PRI(char &ch)
{
if(ch==')'){return 1;}
else if(ch=='+'||ch=='-'){return 2;}
else if(ch=='*'||ch=='/'){return 3;}
else return 0;
}
/*
2.掃描到操作符,與操作符棧的頂端操作符進行比較,
如果優先順序小或相等,則彈出資料和操作符進行計算,將結果送入資料棧;
如果優先順序較大,則進操作符棧;
如果是’(‘直接進棧,如果是’)’,遇到’(‘則抵消.
*/
void Exc_stack()
{
double result_temp;
assert(char_stack.size()>=1&&data_stack.size()>=1);
double temp1=data_stack.top();
data_stack.pop();
double temp2=data_stack.top();
data_stack.pop();
char popchar=char_stack.top();
char_stack.pop();
if(popchar=='+')
result_temp=temp2+temp1;
else if(popchar=='-')
result_temp=temp2-temp1;
else if(popchar=='*')
result_temp=temp2*temp1;
else if(popchar=='/')
result_temp=temp2/temp1;
data_stack.push(result_temp);
}
void push_charinto(char &ch)
{
if(ch=='(')//如果是’(‘直接進棧
char_stack.push(ch);
else if(char_stack.empty())
{
char_stack.push(ch);
}
else if(PRI(ch)>PRI(char_stack.top()))//如果優先順序較大,則進操作符棧
{
char_stack.push(ch);
}
//掃描到操作符
else//如果優先順序小或相等,則彈出資料和操作符進行計算,將結果送入資料棧
{
Exc_stack();
if(ch==')')//如果是’)’,遇’(‘直接彈出.
{
while(char_stack.top()!='(')//操作括號內的內容直到遇到'('為止
{
Exc_stack();
}
char_stack.pop();
}
else
//將自己壓入棧
char_stack.push(ch);
}
}
void push_datainto(double &db)
{
data_stack.push(db);
}
void main()
{
string str;
while(1)
{
bool flag=false;
double ret = 0.0;
double n ;
cout<<"在此輸入表示式:";
//讀 入
cin>>str;
//處理
//篩選
////////////////////////
/////開始掃描
///////////////////////
for(int i=0;i<str.length();i++)
{
if(str[i]>='0' && str[i]<='9')
{
if(!flag)
ret = ret *10 + str[i]-'0';
else
{
ret = ret + (str[i]-'0')/n;
n*=10;
}
}
else if(str[i] == '.')
{
n = 10;
flag = true;
}
else
{
if(ret!=0 || str[i-1]=='0')
push_datainto(ret);
ret=0.0;
flag = false;
push_charinto(str[i]);
}
}
//如果最後一個數字還沒有壓入棧
if(ret!=0||str[i-1]=='0')push_datainto(ret);
//3.掃描資料完成後,依次退棧並進行計算
assert(!data_stack.empty()||!char_stack.empty());
while(data_stack.size()!=1)
{
Exc_stack();
}
// double rre=data_stack.top();
cout<<"結果:"<<data_stack.top()<<endl;
data_stack.pop();
}
}
相關文章
- 表示式計算(棧的應用)
- 使用棧實現表示式求值,運用棧計算
- 使用棧結構計算中綴表示式
- 棧的應用---字尾表示式
- 計算中綴表示式
- PHP使用棧完成高階計算器-接上文模擬棧PHP
- 將算數表示式轉換成字尾表示式並計算結果
- 表示式的動態解析和計算,Flee用起來真香
- 一個數學表示式的計算
- 簡單計算器(棧的應用)
- C#字尾表示式解析計算字串公式C#字串公式
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- 【計算機演算法】 求字首表示式的值計算機演算法
- 算數表示式求值--c語言課程設計C語言
- leetcode 224. 基本計算器(逆波蘭表示式)LeetCode
- c++虛擬函式實現計算表示式子C++函式
- 【棧】【字串語法】牛牛與字尾表示式字串
- 逆波蘭表示式求值——棧與佇列佇列
- 函式計算——應用初探函式
- 亞馬遜雲科技全棧式Serverless,不止於計算亞馬遜全棧Server
- 關於利用STL棧求解四則中綴表示式以及中綴表示式轉逆波蘭表示式和逆波蘭表示式的求解
- C/C++ 陣列連結串列表示式計算C++陣列
- 雲端計算開發教程:Python運算子與表示式Python
- js實現四則計算(中綴,字尾表示式)JS
- 計算廣告實現入門-索引布林表示式索引
- 資料結構與演算法——棧(五)中綴表示式轉字尾表示式資料結構演算法
- 簡單計算器 (關於棧的一種應用)
- 資訊學奧賽複賽複習09-CSP-J2020-03表示式求值前置知識點-中綴表示式求值、摸運算、模運算性質、棧
- Python 如何傳遞運算表示式Python
- 百行以內實現複雜數學表示式計算
- C語言- 基礎資料結構和演算法 - 09 棧的應用_中綴表示式轉字尾表示式20220611C語言資料結構演算法
- Lambda 表示式的應用
- 計算機資料的表示計算機
- 函式計算-HelloWorld應用開發函式
- 計算機程式的思維邏輯 (88) – 正規表示式 (上)計算機
- [計算機網路]協議棧計算機網路協議
- 4、逆波蘭表示式求值——棧(java資料結構)Java資料結構
- 正規表示式的應用
- 怎樣用一個佇列和一個棧實現求一個表示式的值?佇列