算术表达式的转换

题目描述

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

输入

输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)

输出

输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

+*ab*-c/def
a*b+c-d/e*f
ab*cde/-f*+


前缀规律:

1)  设立操作符栈OPTR,结果栈RESULT;

2) 从右向左遍历,若当前字符是操作数,则直接发送给RESULT栈;

3)  若当前运算符的优先数高于等于栈顶运算符,则进OPTR栈;

4)  否则,退出栈顶运算符发送给RESULT栈;

5)   “)” 对它之前后的运算符起隔离作用,“(”可视为自相应右括弧开始的表达式的结束符。(即读到右括号时总是将它压入OPTR栈中,读到左括号时,将靠近栈顶的第一个右括号上面的运算符全部依次弹出,送至RESULT栈后,再丢弃右括号。 )

后缀规律:

1)  设立操作符栈;

2) 若当前字符是操作数,则直接发送给后缀式;

3)  若当前运算符的优先数高于栈顶运算符,则进栈;

4)  否则,退出栈顶运算符发送给后缀式;

5)   “(” 对它之前后的运算符起隔离作用,“)”可视为自相应左括弧开始的表达式的结束符。(即读到左括号时总是将它压入栈中,读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。 )

 

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;


int cmp(char c)//运算符的优先级;
{
    if(c == '+'||c == '-') return 1 ;
    if(c == '*'||c == '/') return 2 ;
    if(c == '(')  return 3 ;
    if(c == ')')  return 4 ;
    return 0 ;
}

void Qianzhui(char a[])//前缀式的获得;数组模拟栈;
{
    int top2 = -1, top3=-1;
    int l = strlen(a);
    char stack2[100], stack3[100];
    for(int i = l-2; i >= 0; i--)//从后往前读入;
    {
        if(a[i] >= 'a'&&a[i]<= 'z')//是英文则进数组stack3;
        {
            stack3[++top3] = a[i];
        }
        else
        {
            if(top2 == -1||stack2[top2] == ')'|| a[i] == ')')//进数组stack2的条件;
            {
                stack2[++top2] = a[i];
            }
            else if(a[i] == '(')
            {
                while(stack2[top2] != ')')
                {
                    stack3[++top3] = stack2[top2--];
                }
                top2--;
            }
            else
            {
                if(cmp(a[i]) < cmp(stack2[top2]))//比较运算优先顺序;
                {
                    stack3[++top3]= stack2[top2--];
                    i++;
                }
                else
                {
                    stack2[++top2] = a[i];
                }
            }
        }
    }
    while(top2 != -1)//将数组stack2的所有元素挪进stack3;
    {
        stack3[++top3] = stack2[top2--];
    }
    for(int i = top3; i >= 0; i--)//逆序输出数组的所有元素;
        printf("%c", stack3[i]);
    printf("\n");
}

void Zhongzhui(char a[])//中缀式的获得;
{
    for(int i = 0; a[i] != '#'; i++)
    {
        if(a[i] !='(' &&a[i] != ')')
            printf("%c", a[i]);
    }
    printf("\n");
}

void Houzhui(char a[])//后缀式的获得;
{
    int top1 = 0;
    char stack1[100] ;
    for(int i = 0; a[i] != '#'; i++)
    {
        if(a[i] >= 'a'&&a[i] <= 'z')//是字母则直接输出;
        {
            printf("%c", a[i]) ;
        }
        else
        {
            if(top1 == 0)//数组空则直接进数组;
            {
                top1++ ;
                stack1[top1] = a[i] ;
            }
            else if(cmp(a[i]) > cmp(stack1[top1]))//优先运算的比较;
            {
                if(cmp(a[i]) == 4)
                {
                    while(stack1[top1] != '(')
                    {
                        printf("%c", stack1[top1--]);
                    }
                    top1-- ;
                }
                else
                {
                    top1++ ;
                    stack1[top1] = a[i];
                }
            }
            else
            {
                if(stack1[top1] != '(')
                {
                    printf("%c", stack1[top1]) ;
                    stack1[top1] = a[i] ;
                }
                else
                {
                    top1++ ;
                    stack1[top1] = a[i] ;
                }
            }
        }
    }
    while(top1 != 0)//数组所有元素的输出;
    {
        printf("%c", stack1[top1]) ;
        top1-- ;
    }
    printf("\n") ;
}

int main()
{
    char a[1005];
    scanf("%s",a);
    Qianzhui(a);//前缀式;
    Zhongzhui(a);//中缀式;
    Houzhui(a);//后缀式;
}




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define stackmax 10000
#define stacknum 10000
typedef int elemtype;
typedef struct
{
    elemtype *base;
    elemtype *top;
    int stacksize;
} sqstack;


int initstack(sqstack &s)//栈的初始化;
{
    s.base = (elemtype *)malloc(stackmax * sizeof(elemtype));
    if(!s.base) exit(0);
    s.top = s.base;
    s.stacksize = stackmax;
}


char push(sqstack &s, char e)//进栈;
{
    if(s.top - s.base > s.stacksize)
    {
        s.base = (elemtype *)realloc(s.base,(s.stacksize+stacknum) * sizeof(elemtype));
        if(!s.base) exit(0);
        s.top = s.base + s.stacksize;
        s.stacksize += stacknum;
    }
    *s.top++=e;
}


int pop(sqstack &s)//出栈;
{
    if(s.top==s.base) return 0;
    s.top--;
    return 1;
}


char gettop(sqstack &s)//获得栈顶元素;
{
    if(s.top == s.base) return 0;
    char e = *(s.top-1);
    return e;
}

int stackempty(sqstack &s)//判断栈是否为空;
{
    if(s.top == s.base)
        return 1;
    else
        return 0;
}

int cmp(char c)//用于比较优先级
{
    if (c=='+'||c=='-')
        return 1;
    if (c=='*'||c=='/')
        return 2;
    if (c=='(')
        return 3;
    if (c==')')
        return 4;
}
char lasttranslate(sqstack &s, char c[])//后缀式的获得;
{
    int n=strlen(c);
    int i;
    for(i=0; i<n; i++)
    {
        if (c[i]>='a'&&c[i]<='z')
            printf("%c", c[i]);
        else
        {
            if(c[i]!='#')
            {
                if(stackempty(s))
                {
                    push(s, c[i]);
                }
                else
                {
                    if(cmp(c[i])>cmp(gettop(s)))
                    {
                        if(c[i]==')')
                        {
                            while(gettop(s)!='(')
                            {
                                printf("%c", *(s.top-1));
                                pop(s);
                            }
                            pop(s);
                        }
                        else
                        {
                            push(s, c[i]);
                        }
                    }
                    else
                    {
                        if(gettop(s)=='(')
                            push(s, c[i]);
                        else
                        {
                            printf("%c", gettop(s));
                            pop(s);
                            push(s,c[i]);
                        }
                    }
                }
            }
        }
    }
}


char pretranslate(sqstack &s1, sqstack &s2, char c[])//前缀式的获得;
{
    int n=strlen(c);
    int i;
    for(i=n-2; i>=0; i--)//逆序读入;
    {
        if (c[i]>='a'&&c[i]<='z')
            push(s1, c[i]);
        else
            if(stackempty(s2))
            {
                push(s2, c[i]);
            }
            else
            {
                if(cmp(c[i])>=cmp(gettop(s2)))
                {
                    if(c[i]=='(')
                    {
                        while(gettop(s2)!=')')
                        {
                            push(s1, *(s2.top-1));
                            pop(s2);
                        }


                        pop(s2);
                    }
                    else
                    {
                        push(s2, c[i]);
                    }
                }
                else
                {
                    if(gettop(s2)==')')
                        push(s2, c[i]);
                    else
                    {
                        push(s1, gettop(s2));
                        pop(s2);
                        push(s2,c[i]);
                    }
                }
            }
    }
}


void putstack1(sqstack &s)//栈内所有元素的输出;
{
    while(s.top > s.base)
    {
        printf("%c", *(s.top-1));
        s.top--;
    }
}


void putstack2(sqstack &s)
{
    while(s.top > s.base)
    {
        printf("%c", *(s.base));
        s.base++;
    }
}


char midtranlate(char c[])//中缀式的获得;
{
    int n=strlen(c), i;
    for(i=0;i<n;i++)
    {
        if(c[i]!='('&&c[i]!=')'&&c[i]!='#')
        printf("%c", c[i]);
    }
}


int main()
{
    char c[110];
    sqstack s;//定义栈;
    sqstack s1, s2;
    initstack(s);//初始化栈;
    initstack(s1);
    initstack(s2);
    scanf("%s", c);
    pretranslate(s1, s2, c);//前缀式
    putstack2(s2);//前缀式的输出;
    putstack1(s1);
    printf("\n");
    midtranlate(c);//中缀式的输出;
    printf("\n");
    lasttranslate(s, c);//后缀式;
    putstack1(s);//栈可能不为空
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程

内容目录&#xff1a; Reactor实现架构对比面向对象的Reactor方案设计函数式编程的Reactor设计示例对比两者的时序图对比结论 Reactor事件驱动的两种设计实现&#xff1a;面向对象 VS 函数式编程 这里的函数式编程的设计以muduo为例进行对比说明&#xff1b; Reactor实现架构对…

ElasticSearch 快照 备份、恢复数据

文章目录ElasticSearch 设置备份文件地址注册快照存储库查看快照存储库保存结果创建快照异步创建指定索引进行快照查看全部快照在服务器查看备份的数据恢复数据本机恢复其他服务器恢复常见问题报错 doesnt match any of the locations specified by path.repo because this set…

java中LinkedList类的操作

LinkedList类是双向链表,单向队列,双向队列,栈的实现类: LinkedList类实现单向队列和双向队列的接口,自身提高了栈操作的方法,链表操作的方法. 在LinkedList类中存在很多方法,但是功能都是相同的.LinkedList表示了多种数据结构的实现,每一种数据结构的操作名字不同. 面试题:编…

数据结构实验之栈七:出栈序列判定

题目描述 给一个初始的入栈序列&#xff0c;其次序即为元素的入栈次序&#xff0c;栈顶元素可以随时出栈&#xff0c;每个元素只能入栈依次。输入一个入栈序列&#xff0c;后面依次输入多个序列&#xff0c;请判断这些序列是否为所给入栈序列合法的出栈序列。 例如序列1&#x…

FileBeat + Pipeline 解析日志 保存至ElasticSearch(实战)

文章目录FileBeat Pipeline 解析日志 保存至ElasticSearch&#xff08;实战&#xff09;下载地址目的日志数据模拟Pipeline创建pipeline查看Pipeline是否创建成功创建FileBeat配置文件 filebeat.yml创建自定义字段 FileBeat fields.yml执行 FileBeatfilebeat 启动命令说明测试…

网络编程中的关键问题总结

内容目录&#xff1a; 连接建立连接断开消息到达发送消息消息发送完毕其它问题参考 网络编程中的关键问题总结 总结下网络编程中关键的细节问题&#xff0c;包含连接建立、连接断开、消息到达、发送消息等等&#xff1b; 连接建立 包括服务端接受 (accept) 新连接和客户端成功发…

List实现类性能和特点分析

面向接口编程: 接口类型 变量 new 实现类(); List list new ArrayList(); List实现类特点和性能分析: 三者共同的特点(共同遵循的规范): 1):允许元素重复. 2):记录元素的先后添加顺序. Vector类: 底层才有数组结构算法,方法都使用了synchronized修饰,线程安全,但是性能…

数据结构实验之栈八:栈的基本操作

题目描述 堆栈是一种基本的数据结构。堆栈具有两种基本操作方式&#xff0c;push 和 pop。push一个值会将其压入栈顶&#xff0c;而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。 输入 首先输入整数t&#xff08;1 < t < 10&#xff09;&#xff0c;代表测…

F5 BIGip 负载均衡 IP算法解密工具

BIGip是对负载均衡的实现&#xff0c;主要通过Virtual Server、iRules、Pool、Node、Monitor和Persistent&#xff08;会话保持&#xff09;实现。BIGip在实现会话保持机制时会在用户首次发起请求时&#xff0c;会为用户设置一个cookie&#xff0c;即服务端会添加set-cookie响应…

Java集合框架-重构设计

根据Vector类,ArrayList类,LinkedList类所有具有的存储特点以及拥有的方法入手,发现共性就往上抽取. 共同的特点: 1):允许元素重复的. 2):会记录先后添加的顺序. 共同的方法: 如下图. 根据他们的特点,我就可以指定规范: 遵循该规范的实现类,无论底层算法如何,都必须保证允…

回文串判定

题目描述 输入一串字符&#xff08;长度小于100&#xff09;&#xff0c;判断该串字符是否是回文串&#xff08;正序读与逆序读内容相同&#xff09;。 输入 输入一串字符&#xff08;长度小于100&#xff09;。 输出 若该串字符是回文串输出“yes"&#xff0c;否则输出”…

Canal Mysql binlog 同步至 Hbase ES

文章目录一、Canal介绍工作原理canal 工作原理二、下载三、安装使用Mysql准备canal 安装解压缩 canal-deployer配置修改启动查看server日志查看instance日志服务停止canal-client使用Canal Adapter数据同步Hbase数据同步ElasticSearch一、Canal介绍 早期阿里巴巴因为杭州和美国…

java中集合的迭代操作

集合的迭代操作: 把集合做的元素一个一个的遍历取出来. 迭代器对象: Iterator: 迭代器对象,只能从上往下迭代. boolean hasNext(); 判断当前指针后是否有下一个元素 Object next():获取指针的下一个元素,并且移动指针. ListIterator: 是Iterator接口的子接口,支持双向迭代…

Canal同步ES报错,java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to c

Canal同步ES报错 提示类型转换失败 2021-09-20 13:10:54.094 [main] ERROR c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Load canal adapter: es7 failed java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: com.alibab…

C语言实验——数组逆序

题目描述 有n个整数&#xff0c;使其最后m个数变成最前面的m个数&#xff0c;其他各数顺序向后移m&#xff08;m < n < 100)个位置。输入 输入数据有2行&#xff0c;第一行的第一个数为n&#xff0c;后面是n个整数&#xff0c;第二行整数m。输出 按先后顺序输出n个整数。…

用C++11的std::async代替线程的创建

转自&#xff1a;http://www.cnblogs.com/qicosmos/p/3534211.html c11中增加了线程&#xff0c;使得我们可以非常方便的创建线程&#xff0c;它的基本用法是这样的&#xff1a; void f(int n); std::thread t(f, n 1); t.join(); 但是线程毕竟是属于比较低层次的东西&#xf…

HashSet类

Set是Collection子接口&#xff0c;模拟了数学上的集的概念。 Set集合存储特点: 1):不允许元素重复. 2):不会记录元素的先后添加顺序. Set只包含从Collection继承的方法&#xff0c;不过Set无法记住添加的顺序&#xff0c;不允许包含重复的元素。当试图添加两个相同元素进Se…

Mysql写入数据时,adapter 日志报ES连接错误

Mysql写入数据时&#xff0c;adapter 日志报ES连接错误 日志如下&#xff1a; 2021-09-20 13:51:03.795 [pool-1-thread-1] ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - NoNodeAvailableException[None of the configured nodes are available: [{#tr…

扩展框架分析

在服务器端启动通信服务器程序CommunicateServer.exe,接受客户端的连接&#xff1b;在客户端启动GameStart.exe&#xff0c;连接至服务器端&#xff0c;在接收到“Start”消息时启动GameEntryPoint.exe&#xff0c;GameEntryPoint.exe 将根据配置文件&#xff08;引导文件&…

走迷宫

题目描述 一个由n * m 个格子组成的迷宫&#xff0c;起点是(1, 1)&#xff0c; 终点是(n, m)&#xff0c;每次可以向上下左右四个方向任意走一步&#xff0c;并且有些格子是不能走动&#xff0c;求从起点到终点经过每个格子至多一次的走法数。 输入 第一行一个整数T 表示有T 组…