C++簡易計算器自寫棧版
利用棧設計並實現一個整型算術表示式計算器(運算子至少包含±*/())。
資料結構:字元陣列。
概要設計:自定義一個棧類,包含char和int兩種型別的陣列。定義一個容量為100的字元陣列,將數字放入數字棧中,將運算子放入字元棧中。出棧規則:當前入棧的運算子比棧頂的運算子優先順序低。
詳細設計:
1.棧中私有部分定義了整型變數top和char、int兩種型別的陣列,可利用同名但變數不同的函式push分別將數字和運算子放入不同棧內。
2. 主函式中定義一個容量為100的字元陣列,利用ACSII碼識別出數字和運算子,利用map函式將數字字元轉化為int型。
3建立兩個類物件,分別表示數字棧和運算子棧,將數字放入數字棧中,將運算子放入字元棧中。
4.寫一個可以區分運算子優先順序的函式。
5.寫一個用來識別運算子並計算的函式。
6.最後運算結束時用top函式獲得數字棧頂端的值,也就是運算結果。
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<char,int> mp;
class stack
{
private:
int top,num[100];
char op[100];
public:
stack()
{
top=0;
}
bool empty()
{
if(top == 0)
return true;
return false;
}
bool full()
{
if(top==99)
return true;
return false;
}
void push(int x)
{
num[top]=x;
top++;
}
void push(char y)
{
op[top]=y;
top++;
}
int top_()
{
return num[top-1];
}
char _top_()
{
return op[top-1];
}
void pop()
{
top--;
}
};
stack num;
stack op;
int yxj(char a) //判定運算子優先順序
{
int k;
if(a=='=')
{k=0;}
if(a=='('||a==')')
{k=1;}
if(a=='+'||a=='-')
{k=2;}
if(a=='*'||a=='/')
{k=3;}
return k;
}
void count()
{
int m=num.top_();
num.pop();
int n=num.top_();
num.pop();
if(op._top_()=='+')
num.push(m+n);
if(op._top_()=='-')
num.push(n-m);
if(op._top_()=='*')
num.push(m*n);
if(op._top_()=='/')
num.push(n/m);
op.pop(); //計算完畢後pop掉該運算子
}
int account(string &str)
{
int len=str.size();
char c;
int l,s,j;
for (c = '0',l=0; c <= '9';c++,l++) //map方法將字元轉化為整數
mp[c] = l;
for(int i=0;i<len;++i)
{
if(op.full()||num.full())
break;
if(str[i]>='0'&&str[i]<='9')
{
s=0;
for(j=i;str[j]>='0'&&str[j]<='9';j++)
{
s=s*10+mp[str[j]];
}
num.push(s);
i=j-1;
}
else
{
if(op.empty()) //op棧為空時直接push
{
op.push(str[i]);
}
else if(yxj(str[i])>yxj(op._top_())||str[i]=='('||str[i]==')')//待入棧運算子優先順序高或是'('和')'push
{
op.push(str[i]);
if(str[i]==')') //為')'時先pop')'
{
op.pop();
if(op._top_()!='(') //op.top不為'('時計算括號中運算子
{
count();
}
op.pop(); //pop掉'('
}
}
else //待入棧運算子str[i]優先順序低於op.top時先對棧頂運算子進行計算
{
count();
op.push(str[i]); //將str[i]放入op棧中
}
if(op._top_()=='=')
break;
}
}
if(op._top_()=='=')
{
op.pop();
while(op.empty()!=1)
{
count();
}
}
return num.top_();
}
int main()
{
string str;
cin>>str;
int jg=account(str);
cout<<jg<<endl;
return 0;
}
執行結果
相關文章
- C++實現簡易計算器C++
- python簡易計算器Python
- 簡單計算器(棧的應用)
- 手寫實現java棧結構,並實現簡易的計算器(基於字尾演算法)Java演算法
- 手把手帶你利用棧來實現一個簡易版本的計算器
- 使用QT做一個簡易計算器QT
- 編譯原理——C++版桌面計算器編譯原理C++
- 手寫簡易版React框架React框架
- 前端 JavaScript 實現一個簡易計算器前端JavaScript
- 編寫一個簡易計時器程式(edu)
- Python編寫一個簡單計算器Python
- 簡單計算器 (關於棧的一種應用)
- QT簡易計算機制作QT計算機
- C++程式設計_簡易計時器(Timer)的控制檯實現C++程式設計
- html+css+js製作一個簡易計算器HTMLCSSJS
- Mac簡易計時器Mac
- PHP使用棧完成高階計算器-接上文模擬棧PHP
- C++ 實現簡略計算π的程式C++
- 基於介面的測試工具研發:使用GUI設計簡易計算器GUI
- 手寫Android事件匯流排框架Eventbus(簡易版)Android事件框架
- 科學計算器學生時代小作品原始碼(C++版)原始碼C++
- 手寫簡易webpackWeb
- 手寫簡易PromisePromise
- 簡單混合運算的計算器
- c++簡易小遊戲C++遊戲
- 手寫Spring MVC框架(一) 實現簡易版mvc框架SpringMVC框架
- 簡易版管道模式模式
- 使用vue寫的計算器demoVue
- c++控制檯寫一個計時器C++
- C++ 練習 簡易日曆C++
- C++簡易執行緒池C++執行緒
- C++(Qt)-GIS開發-簡易瓦片地圖下載器C++QT地圖
- 【計算機二級C++】題目與C++知識自檢計算機C++
- [20211220]sqlplus簡單計算器.txtSQL
- 易語言效率與C++究竟差多少(質數和計算)C++
- 簡易版 vue實現Vue
- 2019雲南行-簡易版
- React簡易版老虎機React