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

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操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi