IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++实现简单计算器,包括括号 -> 正文阅读

[C++知识库]c++实现简单计算器,包括括号

c++实现简单计算器

包括可以实现小括号与加减乘除之间的运算符优先级关系。

基本思路
主要使用c++的栈来进行优先级之间的不同判断,暂时并不支持负数的运算,运算结果中出现的负数可以进行运算。

栈分为两个,第一个栈为操作符的栈,第二个栈为运算数字的栈。
同时在程序初始化时,将运算符之间的优先级关系进行初始化
代码部分如下:

int relation[7][7] = {2,2,1,1,1,2,2,
2,2,1,1,1,2,2,
2,2,2,2,1,2,2,
2,2,2,2,1,2,2,
1,1,1,1,1,3,-1,
2,2,2,2,-1,2,2,
1,1,1,1,1,-1,0,
};

数组下标0-6分别表示的运算符为“+,-,*,/,(,),#”
0为到达输入的末尾,1为栈内操作符的优先关系小于栈外操作符的优先关系。
2为栈内操作符的优先关系大于栈外操作符的优先关系,3为两个括号相遇的情况即(与)相遇,此时需要将括号进行消除。
完整代码如下所示:

#include <iostream>
#include<string>
#include<stack>
#include<cstring>
using namespace std;
using std::string;
string formula;//用户输入的字符串内容
stack <char> operators;//操作符的栈
stack <double> nums;//数字的栈

int relation[7][7] = {2,2,1,1,1,2,2,
2,2,1,1,1,2,2,
2,2,2,2,1,2,2,
2,2,2,2,1,2,2,
1,1,1,1,1,3,-1,
2,2,2,2,-1,2,2,
1,1,1,1,1,-1,0,
};
void menu();//菜单
void inStack();//对字符串入栈操作
int judgeOperator(char c);//判断字符类型
int getSize(char c);//比较运算符的优先关系
char contrast(int s);
double compute(char c,double first,double second);//计算数值
void menu()
{
    cout<<"\n\n\n\n\t\t\t\t\t\t\t\t\t简单计算器"<<endl;
    cout<<"请输入要计算的内容以'#'结尾:"<<endl;
    getline(cin,formula);//得到用户输入的字符串
    inStack();
}
void inStack()
{
    operators.push('#');//对栈进行初始化一下
    char contents[formula.size()];
    strcpy(contents,formula.c_str());
    int i=0;
    for(i=0;i<formula.size();i++)
    {
        int data = judgeOperator(contents[i]);
        if(data==-1)//是数字的
        {
            int s = i;
            while(judgeOperator(contents[s])==-1)
            {
               s++;
            }
            int flag=1;
            int num=0;//将多位数字字符转换为数字
            for(int j=s-1;j>=i;j--)
            {
                num+=flag*(contents[j]-'0');
                flag*=10;
            }
            i=s-1;
            nums.push(num);//将数字压入栈
        }
        else if(data==1||contents[i]=='#')//是操作符
        {
           int x = getSize(operators.top());
           int y=getSize(contents[i]);
            switch(contrast(relation[x][y])){
               case '<'://栈顶元素优先权低
                operators.push(contents[i]);//进栈
                break;
                case '=':
                    operators.pop();//去括号
                    break;
                case '>':
                    {
                    char op = operators.top();//退栈并将运算结果入栈
                    operators.pop();
                    double first=nums.top();//第一个数
                    nums.pop();
                    double second=nums.top();//第二个数
                    nums.pop();
                    nums.push(compute(op,first,second));
                    i--;
                    break;
                    }
                case '!'://结束标志
                    {
                    cout<<"最终结果为:"<<nums.top()<<endl;
                    break;
                    }
                   }
        }
        else
        {
            cout<<"others"<<endl;
        }

    }
}
int judgeOperator(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
    {
        return 1;//是运算符
    }
    else if(isdigit(c)!=0)
    {
        return -1;//是数字
    }
    return 0;//非法字符
}
int getSize(char c)//得到运算符在数组中的位置
{
    switch(c){
case '+':
    return 0;break;
case '-':
                return 1;break;
case '*':
    return 2;break;
case '/':
                return 3 ;break;
case '(':
       return 4;break;
case ')' :
                return 5;break;
case '#':
    return 6;break;
                }
                return -1;
}
char contrast(int s)
{

    if(s==0)
    {
        return '!';//结束符
    }
    else if(s==1)
    {
        return '<';
    }
    else if(s==2)
    {
        return '>';
    }
    else if(s==3)
    {
        return '=';
    }
    return -4;//输入的内容不存在于数组
}
double compute(char c,double first,double second)
{
    double result;
    switch(c){
        case '+':
        result=first+second;
        break;
    case '-':
        result=second-first;
        break;
    case '*':
        result=second*first;
        break;
    case '/':
        result=second/first;
        break;
    }
    return result;
}
int main()
{
    menu();
    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:30:29  更:2022-03-21 20:33:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:07:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码