C语言数据结构之简易计算器

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

主要解决了处理负数、小数等的基础运算操作,无图形界面

#include <iostream>
#include <stack>
using namespace std;

class Calculator{
private:
 int Priority(char fuhao);
 double CalSuffix(string PostfixExp);

public:
 double Calculate(string InfixExp);

  string InfixToSuffix(string InfixExp);

};

double Calculator::CalSuffix(string PostfixExp){
 double tmpresult,ch1,ch2;
 double tmpnum,tmpxiaoshu=1;
 int i=0,tmpdashu;
 int isfu=0; ///
 stack<double> stk2;
 while(PostfixExp[i]!='\0'){
  isfu=0; ///
  if(PostfixExp[i]>=48&&PostfixExp[i]<=57){
   if(PostfixExp[i-1]=='-'){  /////
    isfu=1;
   }
   tmpxiaoshu=1;
   tmpdashu=10;
   tmpnum = PostfixExp[i]-48;
   while(PostfixExp[++i]>=48&&PostfixExp[i]<=57){
    tmpnum = tmpnum*tmpdashu+ (PostfixExp[i]-48);
   }
   i=i-1;
   if(PostfixExp[++i]=='.'){
    while(PostfixExp[++i]>=48&&PostfixExp[i]<=57){
     tmpxiaoshu=tmpxiaoshu*0.1;
     tmpnum = tmpnum + (PostfixExp[i]-48)*tmpxiaoshu;
    }
    i=i-1;
   }
   else{
    i=i-1;
   }
   if(isfu){ ////
    tmpnum=tmpnum*(-1);
   }
   stk2.push(tmpnum);
  }

  else if(PostfixExp[i]=='&'||PostfixExp[i]==' '){
  }

  else {
   if(PostfixExp[++i]>=48&&PostfixExp[i]<=57){
    i=i-1;
   }
   else {
    i=i-1;
    ch2 = stk2.top();
    stk2.pop();
    ch1 = stk2.top();
    stk2.pop();
    switch(PostfixExp[i]){
     case '+': tmpnum = ch1 + ch2; break;
     case '-': tmpnum = ch1 - ch2; break;
     case '*': tmpnum = ch1 * ch2; break;
     case '/': tmpnum = ch1 / ch2;
      if(ch2==0) cout<<"除数为零";break;
    }
    stk2.push(tmpnum);
   }
  }
  i++;
 }
 if(stk2.empty()!=1){
  tmpresult = stk2.top();
  stk2.pop();
 }
 return tmpresult;
}

double Calculator::Calculate(string InfixExp){
 double result;
 result = CalSuffix(InfixToSuffix(InfixExp));
 return result;
}

int Calculator::Priority(char fuhao){
 switch(fuhao){
  case '+':
  case '-': return 2;
  case '*':
  case '/': return 3;
  case '(':
  case ')': return 1;
  default:
   return 0;
 }
}
string Calculator::InfixToSuffix(string InfixExp){
 stack<char> stk;
 string PostfixExp = "     ";
 int i=0,j=0;
 char tmpfuhao;
 int flag = 0; //判断多位数的头数是否为零
 while(InfixExp[i]!='\0'){
  if(InfixExp[i]>=48&&InfixExp[i]<=57){
   flag = 0;
   PostfixExp[j++]='&';
   PostfixExp[j++]=InfixExp[i];
   if(InfixExp[i]=='0'){
    flag = 1;
   }
   while(InfixExp[++i]>=48&&InfixExp[i]<=57){
    if(flag==0)
     PostfixExp[j++]=InfixExp[i];
    else
     cout<<"输入错误数字";
   }
   i=i-1;
   if(InfixExp[++i]=='.'){
    PostfixExp[j++]='.';
    while(InfixExp[++i]>=48&&InfixExp[i]<=57){
     PostfixExp[j++]=InfixExp[i];
    }
    i=i-1;
   }
   else{
    i=i-1;
   }
  }

  else if(InfixExp[i]=='('){
   stk.push(InfixExp[i]);
  }

  else if(InfixExp[i]==')'){
   if(stk.empty()){
    cout<<"表达式错误!";
   }
   else{
    tmpfuhao = stk.top();
    while(tmpfuhao!='('){
     if(stk.empty()){
      cout<<"表达式错误!";
     }
     else{
      PostfixExp[j++] = '&';
      PostfixExp[j++] = tmpfuhao;
      stk.pop();
      tmpfuhao = stk.top();
     }
    }
    stk.pop();
   }
  }

  else if(InfixExp[i]=='+'||InfixExp[i]=='-'||InfixExp[i]=='*'||InfixExp[i]=='/'){
   if(i==0||((InfixExp[--i]<48||InfixExp[i]>57)&&InfixExp[i]!=')')){
    i++;
    PostfixExp[j++]='&';
    PostfixExp[j++]='-';
    while(InfixExp[++i]>=48&&InfixExp[i]<=57){
     PostfixExp[j++]=InfixExp[i];
    }
    i=i-1;
    if(InfixExp[++i]=='.'){
     PostfixExp[j++]='.';
     while(InfixExp[++i]>=48&&InfixExp[i]<=57){
      PostfixExp[j++]=InfixExp[i];
     }
     i=i-1;
    }
    else{
     i=i-1;
    }
   }
   else{
    i++;
   if(stk.empty()){
    stk.push(InfixExp[i]);
   }
   else{
    tmpfuhao = stk.top();
    if(Priority(tmpfuhao)<Priority(InfixExp[i])){
     stk.push(InfixExp[i]);
    }
    else{
     while(Priority(tmpfuhao)>=Priority(InfixExp[i])){
      PostfixExp[j++] = '&';
      PostfixExp[j++] = tmpfuhao;
      stk.pop();
      if(stk.empty()!=1){
       tmpfuhao = stk.top();
      }
      else break;
     }
     stk.push(InfixExp[i]);
    }
   }
   }
  }
  else{
   cout<<"符号错误!";
   break;
  }
  i++;
 }

 while(!stk.empty()){
  tmpfuhao = stk.top();
  PostfixExp[j++] = '&';
  PostfixExp[j++] = tmpfuhao;
  stk.pop();
 }
 PostfixExp[j++] = '\0';
 return PostfixExp;
}

int main(int argc, const char * argv[]) {
 string a;
 Calculator a1;
 cin>>a;
 cout<<a1.Calculate(a)<<endl;
 cout<<a1.InfixToSuffix(a);
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C/C++实现日期计算器的示例代码

    问题介绍: 今天突然看到一个问题看起来蛮有趣的,跟大家分享一下. 给定任意日期对该日期进行加减天数,最后得出加减后出现的日期.以及给两个日期你可以得出他们两个之间相隔多少天.(需要考虑闰年,每个月天数不同,我们需要写一个我们直接可以使用的日期加减器)因为时间比较仓促,我也没有写界面,只有其中几个主要的函数的架构思想以及简单的调试就发出来了. 代码实现: #include<iostream> #include<Windows.h> #include<assert.h> u

  • c++编写简单的计算器程序

    首先来看下本人的开发环境 系统:win7 电脑:dell 运行环境:vs2015 语言:c++ 简单计算器代码 //四则运算 #include "stdafx.h" #include<iostream> #include<stdio.h> using namespace std; void add() { printf("输入要计算的加数(例如a b)\n"); int adda=0, addb=0,addc=0; cin >>

  • C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入两个整数和一个运算符,输出运算结果. Input 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. Output 输出对两个数运算后的结果. Example Input 30 50 * Example Output import j

  • C++有限状态机实现计算器小程序

    本文介绍利用有限状态机原理开发计算器小程序的过程. 实现的功能 支持整数.小数输入 支持+ - * / 四则运算 CE 清除当前操作数 C 清除所有.回到初始状态 回显操作数和结果 HSM状态图 计算器可以分为七种状态:Start.Operand_1.Negate_1.Operator.Operand_2.Negate_2.Error.其中Start.Operand_1.Operand_1状态又分了几种子状态. 下面简要的介绍下状态状态转换的过程: 启动软件,进入Start状态 当用户点击1-9

  • C语言数据结构之简易计算器

    本文实例为大家分享了C语言简易计算器的具体代码,供大家参考,具体内容如下 主要解决了处理负数.小数等的基础运算操作,无图形界面 #include <iostream> #include <stack> using namespace std; class Calculator{ private: int Priority(char fuhao); double CalSuffix(string PostfixExp); public: double Calculate(string

  • C语言实现简易计算器功能

    本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下 表达式求值项目(多功能计算器).该项目主要包含了10个模块,10项功能: 1:加法运算:主要进行两个数的加法运算,可进行计算整数和浮点数: 2:减法运算:主要进行两个数的减法运算,可进行计算整数和浮点数: 3:乘法运算:主要进行两个数的乘法运算,可进行计算整数和浮点数: 4:除法运算:主要进行两个数的除法运算,可进行计算整数和浮点数:增加了报错功能,由于除数不可以为0,当用户输入的除数为0的时候,该项目会出提示红色

  • Android Studio实现简易计算器App (Java语言版)

    本文实例为大家分享了Android Studio实现简易计算器App的具体代码,供大家参考,具体内容如下 效果演示 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical&qu

  • Python PyQt5实现的简易计算器功能示例

    本文实例讲述了Python PyQt5实现的简易计算器功能.分享给大家供大家参考,具体如下: 这里剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSize(QtCore.QSize(60,30)) 3.取事件的的发送者(此例为各个按钮)的文本: self.sender().text() [效果图] [源代码] import sys from PyQt

  • Python正则表达式实现简易计算器功能示例

    本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+1)*5.1-3+2**2 import re class SimpleCalc(object): # 表达式检测 def check(self,exp): # 合法字符检测 res = re.findall(r"[^\d\+\-\*/\(\)\.]", exp) print(res) i

  • C语言数据结构之二叉树的非递归后序遍历算法

    C语言数据结构之二叉树的非递归后序遍历算法 前言: 前序.中序.后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的,必须有一些额外的信息存放在栈中. 方法有很多,这里只举一种,先定义栈结点的数据结构 typedef struct{Node * p; int rvisited;}SNode //Node 是二叉树的结点结构,rvisited==1代表p所指向的结点的右结点已被访问过. lastOrderTraverse(BiTree bt){ //首先,从根节点开始,

  • C语言数据结构之判断循环链表空与满

    C语言数据结构之判断循环链表空与满 前言: 何时队列为空?何时为满? 由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等.因此,我们无法通过front=rear来判断队列"空"还是"满". 注:先进入的为'头',后进入的为'尾'. 解决此问题的方法至少有三种: 其一是另设一个布尔变量以匹别队列的空和满: 其二是少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始

  • C语言数据结构实现字符串分割的实例

    C语言数据结构实现字符串分割的实例 以下为"字符串分割"的简单示例: 1. 用c语言实现的版本 #include<stdio.h> /* 根据空格分隔字符串 */ int partition(char *src, char *par, int pos) { int i,j; i = pos; //取到第一个非空格字符 while(src[i] == ' ') { ++i; } if(src[i] != '\0') { j = 0; while((src[i] != '\0'

  • 基于python的Tkinter实现一个简易计算器

    本文实例介绍了基于python的Tkinter实现简易计算器的详细代码,分享给大家供大家参考,具体内容如下 第一种:使用python 的 Tkinter实现一个简易计算器 #coding:utf-8 from Tkinter import * import time root = Tk() def cacl(input_str): if "x" in input_str: ret = input_str.split("x") return int(ret[0]) *

  • C语言数据结构链表队列的实现

    C语言数据结构链表队列的实现 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 typedef int QElemtype; typedef int status; 2.代码分解 2.1对队列和节点的结构定义 typedef struct

随机推荐