C++.简易计算器的实现
1 前言
为了巩固自己的C++知识点,写了一个简易的四则运算计算器。尤其多用到了一些简单的数据结构与STL标准库的模板。
1.1 知识点
- vector、string、map、stack的使用
- 中缀表达式转后缀表达式
- 对后缀表达式的计算
2 实现流程
2.1 简单的流程图
2.2 主要函数
- Despace,去除输入字符串中的空格
- Convert,对表达式进行转换
- Caculate,对后缀表达式进行计算
2.3 其它注意点
- 利用map实现运算符的优先级(这里也可以使用函数与switch语句)
- Convert函数中使用中转字符串,“当下一字符为符号或NULL时,将数字压入vetcor”
为什么使用vector存储后缀表达式?
这里的vector存储的是string元素,如果直接以string输出,每一个元素是char类型,将不适合参与计算。使用string后可以使用函数stoi与to_string进行字符串与整数的转换。
3 代码分析
3.1 头文件head.h
#ifndef HEAD_H_
#define HEAD_H_
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <map>
using namespace std;
void Despace(string &s);
vector<string> Convert(string &s);
void Calculate(vector<string> &s);
#endif
3.2 函数实现 head.cpp
#include"head.h"
map<char,int> smap = {
{'*',3},
{'/',3},
{'+',2},
{'-',2},
{'(',1}
};
void Despace(string &s)
{
int index = 0;
if (!s.empty())
{
while ((index = s.find(' ', index)) != string::npos)
{
s.erase(index, 1);
}
}
}
vector<string> Convert(string &s)
{
vector<string> v;
stack<char> sstack;
string nums = "0123456789";
string oper_ = "+-*/()";
string st = "";
for (int i = 0;i < s.size();i++)
{
if (nums.find(s[i]) != string::npos)
{
st = st + s[i];
if (oper_.find(s[i + 1]) != string::npos || s[i + 1] == NULL)
{
v.push_back(st);
st = "";
}
}
else if (s[i] == '(')
{
sstack.push(s[i]);
}
else if (s[i] == ')')
{
char temp = sstack.top();
sstack.pop();
if (temp != '(')
{
st = "";
st = st + temp;
v.push_back(st);
temp = sstack.top();
sstack.pop();
}
}
else
{
while (sstack.empty() == false && smap[sstack.top()] >= smap[s[i]])
{
st = "";
st = st + sstack.top();
v.push_back(st);
sstack.pop();
}
sstack.push(s[i]);
}
}
while (sstack.empty() == false)
{
st = "";
st = st + sstack.top();
sstack.pop();
v.push_back(st);
}
return v;
}
void Calculate(vector<string> &v)
{
string st;
int x, y, z;
stack<string> sstack;
string oper_ = "+-*/";
for (int i = 0;i < v.size();i++)
{
if (oper_.find(v[i]) != string::npos)
{
x = std::stoi(sstack.top());
sstack.pop();
y = std::stoi(sstack.top());
sstack.pop();
if (v[i] == "+")
{
z = x + y;
st = to_string(z);
sstack.push(st);
}
else if (v[i] == "-")
{
z = x - y;
st = to_string(z);
sstack.push(st);
}
else if (v[i] == "*")
{
z = x * y;
st = to_string(z);
sstack.push(st);
}
else if (v[i] == "/")
{
z = x / y;
st = to_string(z);
sstack.push(st);
}
}
else
{
sstack.push(v[i]);
}
}
st = sstack.top();
cout << st;
}
3.3 main主函数
#include"head.h"
int main()
{
string s;
vector<string> v;
cout << "请输入四则运算的值:";
getline(cin, s);
Despace(s);
v = Convert(s);
Calculate(v);
getchar();
return 0;
}
4 运行截图
5 总结
本次小项目让我更加熟练了数据结构与C++的STL库,但是也发现了我对这些模板的运用不够熟练,以及项目开发经验较少。接下来打算阅读《STL源码剖析》。此外,我将会把计算器完善,使用Qt将界面UI设计好,并扩充计算器功能。
|