浮点数 四则运算 小程序 利用符号优先级和双栈

2024-01-27 09:58

本文主要是介绍浮点数 四则运算 小程序 利用符号优先级和双栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:http://www.cnblogs.com/xieduo/articles/776665.html

浮点数 四则运算 小程序 利用符号优先级和双栈

/**************四则运算*************/
/***********作者:xiaocui**********/
/***********时间:2006.10.27*******/
/***********版本:v1.0*************/

/*******解决方案: 按照编译原理里面的 算符优先
算法,定义算符+ - * / ( ) 的优先级;设置两个
栈: 符号栈和数字栈,根据优先级进行压栈和出栈
操作,最后如果符号栈为空,则表达式正确, 输出结果;
如果符号栈不空或数字栈元素超过1,则表达式错误.**/

#include
#include
#include
#include
using namespace std;

/*******定义优先级**********/
/**
            +   -  *   /   (   ) (进栈符号)
(栈顶符号)
    +       >   >  <   <   <   >  

    -       >   >  <   <   <   >

    *       >   >  >   >   <   >

    /       >   >  >   >   <   >

    (       <   <  <   <   <   <

    )       >   >  >   >   >   >

***************************/
/*******  >  <  表示栈顶符号和要进栈符号的优先关系,
如果 栈顶符号的优先级>要进栈符号的优先级,执行计算;
如果 栈顶符号的优先级 <要进栈符号的优先级,符号进栈***>

/*******返回栈顶符号是否优先与进栈符号*******/
bool  is_prior_exe(char  top, char in)
{
if(top==')')  //右括号,栈顶优先级大
{
  return  true;
}
if(top=='(')    //左括号,栈顶优先级小
{
  return  false;
}
if(top=='*' || top=='/')
{
  if(in!='(')
  {
   return  true;
  }
  else
  {
   return  false;
  }
}
if(top=='+' || top=='-')
{
  if(in=='+' || in=='-' || in==')')
  {
   return true;
  }
  if(in=='*' || in=='/' || in=='(')
  {
   return false;
  }
}
}

/*********把字符串转化成双精度浮点数*******/
double  change_str_to_double(char *str)
{
//得到整数部分
int  num=0;
while(*str!='/0' && *str!='.')
{
  num=num*10+(*str-'0');
  str++;
}
if(*str=='/0')
{
  return  num;
}
//得到小数部分
while(*str!='/0')
{
  str++;
}
str--;
double  num2=0;
while(*str!='.')
{
  num2=num2*0.1+(*str-'0');
  str--;
}
num2=num2*0.1;
return  num+num2;
}

/**********简单的词法分析*********/
vector get_word(string str)
{
vector word; //装载词法分析的单词
int i=0;
while(i
{
  if(str[i]=='(' || str[i]==')' || str[i]=='*' ||
     str[i]=='/' || str[i]=='+' || str[i]=='-')
  {
   //运算符,构成单个单词,加入word中
   char * tmp =new char[2];
   tmp[0]=str[i];
   tmp[1]='/0';
   word.push_back(tmp);
  }
  if((str[i]-'0'>=0 && str[i]-'0'<=9)||str[i]=='.')
  {
   static int j=-1;
   static char * tmp;
      if(j==-1) //只在第1次, 建立数组保存浮点数
   {
    j=i;
    tmp=new char [15];
   }
      tmp[i-j]=str[i];
   if(i+1 9) && str[i+1]!='.')//下一个不是数字,结束字符串
   {
    tmp[i+1-j]='/0';
    word.push_back(tmp);
    j=-1;
   }
   else if (i+1==str.size()) //字符串最后一个字符是数字
   {
    tmp[i+1-j]='/0';
    word.push_back(tmp);
    j=-1;
   }
  }
  i++;
}
return word;
}

/******************进栈和计算处理******************/
double  instack_compute (vector cpvec)
{
//建立数字栈
stack dstack;
//建立符号栈
    stack cstack;
int i=0;
while(i
{
  //是数字,进数字栈
  if(cpvec[i][0]-'0'>=0 && cpvec[i][0]-'0'<=9)
  {
   //转化为double
   double tmp=change_str_to_double(cpvec[i]);
   dstack.push(tmp);
  }
  //是运算符,比较优先级 决定 进栈还是计算
  if(cpvec[i][0]=='+' || cpvec[i][0]=='-' || cpvec[i][0]=='*' ||
     cpvec[i][0]=='/' || cpvec[i][0]=='(' || cpvec[i][0]==')' )
  {
   char  c_in=cpvec[i][0];  //要进栈的符号
   //符号栈为空,当前符号进栈
   if(cstack.empty())
   {
    cstack.push(c_in);
   }
   else
   {
    char  c_top=cstack.top(); //栈顶符号    
    if( is_prior_exe(c_top, c_in)==false)
    {
     //栈顶符号优先级低
     cstack.push(c_in);
    }
    if( is_prior_exe(c_top, c_in)==true )
    {
     //栈顶符号优先级高,开始计算
     if(c_top=='+')
     {
      double  num_second=dstack.top();
      dstack.pop();
      double  num_first=dstack.top();
      dstack.pop();
      double rs=num_first+num_second;
      dstack.push(rs);
      cstack.pop();
     }
     if(c_top=='-')
     {
      double  num_second=dstack.top();
      dstack.pop();
      double  num_first=dstack.top();
      dstack.pop();
      double rs=num_first-num_second;
      dstack.push(rs);
      cstack.pop();
     }
     if(c_top=='*')
     {
      double  num_second=dstack.top();
      dstack.pop();
      double  num_first=dstack.top();
      dstack.pop();
      double rs=num_first*num_second;
      dstack.push(rs);
      cstack.pop();
     }
     if(c_top=='/')
     {
      double  num_second=dstack.top();
      dstack.pop();
      double  num_first=dstack.top();
      dstack.pop();
      if(num_second!=0)
      {
       double rs=num_first/num_second;
       dstack.push(rs);
       cstack.pop();
      }
      else
      {
       cout<<"算术表达式中出现 除数为0的错误,请检查!"<
       exit(0);
      }
     }
     if(c_top==')')
     {
      cstack.pop();
      cstack.pop();
     }
     i--; //刚才那个还在外面等的算符不能漏掉
    }
   }
  }
  i++; //更新循环变量 (这个怎么老是忘呢?)
}
    while(cstack.empty()!=true) //当符号栈不空,而计算式已经遍历完,开始计算
{
  char c_top=cstack.top();
  if(c_top=='+')
  {
   double  num_second=dstack.top();
   dstack.pop();
   double  num_first=dstack.top();
   dstack.pop();
   double rs=num_first+num_second;
   dstack.push(rs);
   cstack.pop();
  }
  if(c_top=='-')
  {
   double  num_second=dstack.top();
   dstack.pop();
   double  num_first=dstack.top();
   dstack.pop();
   double rs=num_first-num_second;
   dstack.push(rs);
   cstack.pop();
  }
  if(c_top=='*')
  {
   double  num_second=dstack.top();
   dstack.pop();
   double  num_first=dstack.top();
   dstack.pop();
   double rs=num_first*num_second;
   dstack.push(rs);
   cstack.pop();
  }
  if(c_top=='/')
  {
   double  num_second=dstack.top();
   dstack.pop();
   double  num_first=dstack.top();
   dstack.pop();
   if(num_second!=0)
   {
    double rs=num_first/num_second;
    dstack.push(rs);
    cstack.pop();
   }
   else
   {
    cout<<"算术表达式中出现 除数为0的错误,请检查!"<
    exit(0);
   }
  }
  if(c_top==')')
  {
   cstack.pop();
   if(cstack.empty() || cstack.top()!='(')//栈空 或 另外一个不是'('
   {
    cout<<"表达式有误,括号不匹配"<
    return -1;
   }
   cstack.pop();
  }
}
return  dstack.top();
}

void main()
{
    cout<<"请输入运算表达式:"<
    string  str;
    cin>>str;
    vector cpvec=get_word(str);
    cout<<"运算结果为:"<
    cout< <
}

这篇关于浮点数 四则运算 小程序 利用符号优先级和双栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/649885

相关文章

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线