服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++实现简易计算器功能

C++实现简易计算器功能

2022-09-07 15:29boy eleven C/C++

这篇文章主要为大家详细介绍了C++实现简易计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下

介绍

介绍:仅支持自然数间的+ - * /操作,并没有括号。

实现:利用栈实现存储运算数以及运算符。

流程

1、输入:string exp

2、对EXP进行处理:数字入数栈,运算符入字符栈。

 1)栈空,字符入栈
 2)栈非空
      栈顶运算级别> =当前字符运算级,取栈顶运算符并出栈两个数,计算,结果入数栈
 3)字符入栈

3、对字符栈检测,非空时进行计算

4、输出:结果。

实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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;
    }
}

计算:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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

延伸 · 阅读

精彩推荐
  • C/C++C语言中指针和数组试题详解分析

    C语言中指针和数组试题详解分析

    变量存放在内存中,内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行...

    Dark And Grey3572022-02-12
  • C/C++C++交换指针实例

    C++交换指针实例

    这篇文章主要介绍了C++交换指针实例,针对C与C++交换指针的方法进行了较为详细的对比分析,非常具有实用价值,需要的朋友可以参考下...

    C++教程网11852021-02-04
  • C/C++使用pybind11封装C++结构体作为参数的函数实现步骤

    使用pybind11封装C++结构体作为参数的函数实现步骤

    这篇文章主要介绍了用pybind11封装C++结构体作为参数的函数实现步骤,本文分步骤通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋...

    追忆10092021-08-19
  • C/C++C++中的auto_ptr智能指针的作用及使用方法详解

    C++中的auto_ptr智能指针的作用及使用方法详解

    这篇文章主要介绍了C++中的auto_ptr智能指针的作用及使用方法详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    20101204226172021-04-09
  • C/C++C语言实现简单电子通讯录

    C语言实现简单电子通讯录

    这篇文章主要为大家详细介绍了C语言实现简单电子通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    believe_s4422021-09-14
  • C/C++C和指针小结(推荐)

    C和指针小结(推荐)

    下面小编就为大家带来一篇C和指针小结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧...

    C语言教程网4962021-04-06
  • C/C++C++函数的默认参数详情

    C++函数的默认参数详情

    这篇文章主要介绍了C++函数的默认参数得相关资料,C++中的默认参数的用法和Python基本一致。使用默认参数的方法非常简单,也就是我们在函数声明的时候,...

    梁唐8302022-02-27
  • C/C++Windows消息传递机制详解

    Windows消息传递机制详解

    这篇文章主要介绍了Windows消息传递机制,有助于读者更好的理解windows编程的消息机制,需要的朋友可以参考下...

    C语言程序设计13412021-01-22