后缀表达式+栈的应用=四则表达式运算

2024-08-28 07:38
文章标签 应用 运算 表达式 后缀

本文主要是介绍后缀表达式+栈的应用=四则表达式运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

思路重点:1,中缀表达式转换成后缀表达式
    2,对后缀表达式求值
作业要求:
C++ 语言环境下 实现顺序栈的 应用操作:
①利用栈实现十进制数转换成八进制数。
②利用栈实现一位数的加减乘除的表达式求解。
以下是我写的代码  其中输入的时候只能输入一位数。
PS//这个代码写的有点挫  请看这个: http://fengweiding.blog.163.com/blog/static/23005412120153541951710/#

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<stack>
#define MAXLEN 100
using namespace std;
class Stack ///手写栈
{
public:
Stack()
{
top = -1;
}
int Pop();
int Push(char c);
char ReadTop();
bool Sempty();
int Size();
int top;
char s[MAXLEN];
};
int Stack::Pop()
{
if (Stack::Sempty())return 0;
else{
top--;
}
}
int Stack::Push(char c)
{
if (top == MAXLEN - 1)return 0;
else
{
top++;
s[top] = c;
return 1;
}
}
char Stack::ReadTop()
{
if (Stack::Sempty())return 0;
return s[top];
}
bool Stack::Sempty()
{
if (top==-1)
return true;
else return false;
}
int Stack::Size()
{
return top;
}
Stack s;
void Convertinto8(int d)
{
Stack sk;
int ba;
while(1)
{
if(d==0)break;
ba=d%8;
sk.Push((char)(ba+'0'));
d=d/8;
}
cout<<"八进制数字为:";
while(!sk.Sempty())
{
cout<<sk.ReadTop();
sk.Pop();
}
cout<<endl;
}
void Calculate()
{
Stack A,B;//A用来存符号 B用来存后缀表达式

stack<int>C;///偷懒了一把,C用的是stl里的栈 计算后缀表的式的时候要用到C
char c[100];
cout<<"请输入表达式:"<<endl;
while(cin>>c)
{
int len=strlen(c);
for(int i=0;i<len;i++)
{
if(c[i]==' '){cout<<"error"<<endl;break;}
switch(c[i])
{
case '*':{if(!A.Sempty()){char k=A.ReadTop();if(k=='*'||k=='/'){
while(!A.Sempty())
{
char k=A.ReadTop();A.Pop();B.Push(k);
if(A.ReadTop()!='*'&&A.ReadTop()!='/')break;
}

} A.Push(c[i]);
}
else A.Push(c[i]);break;}
case '/':{if(!A.Sempty()){char k=A.ReadTop();if(k=='*'||k=='/'){
while(!A.Sempty())
{
char k=A.ReadTop();A.Pop();B.Push(k);
if(A.ReadTop()!='/'&&A.ReadTop()!='*')break;
}

} A.Push(c[i]);
}
else A.Push(c[i]);break;}
case '+':{if(!A.Sempty()){char k=A.ReadTop();if(k=='/'||k=='*')
{while(!A.Sempty()){char k=A.ReadTop();B.Push(k);A.Pop();}
A.Push(c[i]);}else A.Push(c[i]);}
else A.Push(c[i]);break;
}
case '-':{if(!A.Sempty()){char k=A.ReadTop();if(k=='/'||k=='*')
{while(!A.Sempty()){char k=A.ReadTop();B.Push(k);A.Pop();}
A.Push(c[i]);}
else if(k=='-'){char k=A.ReadTop();A.Pop();B.Push(k);A.Push(c[i]);}else A.Push(c[i]);}
else A.Push(c[i]);break;
}
case')':{while(!A.Sempty()&&A.ReadTop()!='('){char k=A.ReadTop();A.Pop();B.Push(k);}
A.Pop();break;
}
case '(':{A.Push(c[i]);break;}
default :{B.Push(c[i]);break;}
}
}
while(!A.Sempty())
{
char k;
k=A.ReadTop();
A.Pop();
B.Push(k);
}
char s1[100];
int length=B.Size();
for(int i=length;i>=0;i--)
{
s1[i]=B.ReadTop();
B.Pop();
}
int d1,d2;
for(int i=0;i<=length;i++)
{
int d=0;
if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/')
{
d1=C.top();C.pop();
d2=C.top();C.pop();
switch(s1[i])
{
case'+':{d=d1+d2;break;}
case'-':{d=d2-d1;break;}
case'*':{d=d1*d2;break;}
case'/':{d=d2/d1;break;}
}
C.push(d);
}
else C.push((int)(s1[i]-'0'));
}
cout<<"结果为:";cout<<C.top()<<endl;
C.pop();
cout<<"请输入表达式:"<<endl;
}

}
int main()
{
int n;
cout<<"10进制转换成8进制,请输入10进制数字"<<endl;
cin>>n;
Convertinto8(n);
Calculate();
return 0;
}



这篇关于后缀表达式+栈的应用=四则表达式运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时