C++簡易計算器自寫棧版

伽可發表於2020-10-08

利用棧設計並實現一個整型算術表示式計算器(運算子至少包含±*/())。

資料結構:字元陣列。

概要設計:自定義一個棧類,包含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;
}

執行結果
在這裡插入圖片描述

相關文章