日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++實現簡易計算器功能_C 語言

作者:boy?eleven ? 更新時間: 2022-04-09 編程語言

本文實例為大家分享了C++實現簡易計算器功能的具體代碼,供大家參考,具體內容如下

介紹

介紹:僅支持自然數間的+ - * /操作,并沒有括號。

實現:利用棧實現存儲運算數以及運算符。

流程

1、輸入:string exp

2、對EXP進行處理:數字入數棧,運算符入字符棧。

?1)棧空,字符入棧
?2)棧非空
? ? ? 棧頂運算級別> =當前字符運算級,取棧頂運算符并出棧兩個數,計算,結果入數棧
?3)字符入棧

3、對字符棧檢測,非空時進行計算

4、輸出:結果。

實現

const int MAXSIZE = 100;//棧的最大大小

template<typename T>
class Stack {
private:
?? ?T data[MAXSIZE];
?? ?int top;
public:
?? ?Stack();

?? ?void Push(const T& val);
?? ?T Top()const;
?? ?void Pop();

?? ?void Clear();

?? ?bool IsFull()const;
?? ?bool IsEmpty()const;
};

template<typename T>
Stack<T>::Stack() {
?? ?top = -1;
}

template<typename T>
void Stack<T>::Push(const T& val) {
?? ?if (IsFull()) exit(1);
?? ?//未滿
?? ?data[++top] = val;
}


template<typename T>
T Stack<T>::Top()const {
?? ?if (IsEmpty()) exit(1);
?? ?//非空
?? ?return data[top];
}

template<typename T>
void Stack<T>::Pop() {
?? ?if (IsEmpty()) exit(1);
?? ?--top;
}

template<typename T>
void Stack<T>::Clear() {
?? ?top = -1;
}

template<typename T>
bool Stack<T>::IsFull()const {
?? ?return top == MAXSIZE - 1;
}
template<typename T>
bool Stack<T>::IsEmpty()const {
?? ?return top == -1;
}
?
class Calculator {
private:
?? ?Stack<int> num;
?? ?Stack<char> ch;//運算符
?? ?
?? ?bool GetTwoOperands(int& left,int& right);
?? ?void Compute();

?? ?void Deal(const string& exp);
public:
?? ?Calculator() {}
?? ?void Run();
?? ?void Clear();//清空數棧以及字符棧
};

void Calculator::Run() {
?? ?string exp;
?? ?cin >> exp;
?? ?Deal(exp);
?? ?while ( !ch.IsEmpty()) {
?? ??? ?Compute();
?? ?}
?? ?cout << "結果:" << num.Top() << endl;
?? ?Clear();
}

void Calculator::Deal(const string& exp) {
?? ?int i(0), n(exp.length());
?? ?bool last = false;
?? ?while (i < n&&exp[i] != '=') {
?? ??? ?if (exp[i] >= '0'&&exp[i] <= '9') {
?? ??? ??? ?if (last) {
?? ??? ??? ??? ?int x = num.Top() * 10 + (exp[i] - '0');
?? ??? ??? ??? ?num.Pop();
?? ??? ??? ??? ?num.Push(x);
?? ??? ??? ?}
?? ??? ??? ?else {
?? ??? ??? ??? ?num.Push(exp[i] - '0');
?? ??? ??? ??? ?last = true;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else {
?? ??? ??? ?last = false;
?? ??? ??? ?while (!ch.IsEmpty()) {
?? ??? ??? ??? ?int i1 = f(ch.Top());
?? ??? ??? ??? ?int i2 = f(exp[i]);
?? ??? ??? ??? ?if (i1 >= i2)
?? ??? ??? ??? ??? ?Compute();
?? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?ch.Push(exp[i]);
?? ??? ?}
?? ??? ?++i;
?? ?}
}

計算:

void Calculator::Compute() ?{
?? ?bool b;
?? ?int left, right;
?? ?b = GetTwoOperands(left, right);
?? ?if (!b) {
?? ??? ?cout << "Error\n";
?? ??? ?Clear();
?? ?}
?? ?else {
?? ??? ?char op = ch.Top();
?? ??? ?ch.Pop();
?? ??? ?switch (op) {
?? ??? ?case '+':
?? ??? ??? ?left += right;
?? ??? ??? ?break;
?? ??? ?case '-':
?? ??? ??? ?left -= right;
?? ??? ??? ?break;
?? ??? ?case '*':
?? ??? ??? ?left *= right;
?? ??? ??? ?break;
?? ??? ?case '/':
?? ??? ??? ?if (right == 0) {
?? ??? ??? ??? ?cout << "Error\n";
?? ??? ??? ??? ?Clear();
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?left /= right;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?num.Push(left);
?? ?}
}

// 將運算符優先級轉為整數,便于比較
int f(const char& c) {
?? ?if (c == '+' || c == '-') return 1;
?? ?else return 2;
}

原文鏈接:https://blog.csdn.net/qq_31854267/article/details/109086232

欄目分類
最近更新