数据结构-中序转后序

#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
#include<cctype>

using namespace std;

void print(vector<string> &);
void transform(vector<string>&,vector<string>&);

int main()
{
    cout<<"请输入阿拉伯数字\n";
    vector<string> _in_vec;
    char tmp;
    string s;
    stringstream stream;
    while((tmp = getchar()) != ‘\n‘)
    {
        if(tmp == ‘+‘||tmp==‘-‘||tmp==‘*‘||tmp==‘/‘||tmp==‘(‘||tmp==‘)‘)
        {
            if(!s.empty())
            {
                _in_vec.push_back(s);
                s.clear();
            }
            stream<<tmp;
            stream>>s;
            stream.clear();
            _in_vec.push_back(s);
            s.clear();
        }
        else if(tmp == ‘ ‘)
        {
            if(!s.empty())
            {
                _in_vec.push_back(s);
                s.clear();
            }
        }
        else if(isdigit(tmp))
        {
            s += tmp;
        }
    }
    if(!s.empty())
    {
        _in_vec.push_back(s);
        s.clear();
    }
    print(_in_vec);
    vector<string> _out_vec;
    transform(_in_vec,_out_vec);
    print(_out_vec);
    
    return 0;
}

void print(vector<string> & _vec)
{
    cout<<"\n";
    for(int i = 0 ;i < _vec.size();i++)
        cout<<_vec[i];
}

void transform(vector<string>&_in_vec,vector<string>&_out_vec)
{
    vector<string> tmp;
    for(int i = 0;i != _in_vec.size();i++)
    {
        if(isdigit((_in_vec[i]).at(0)))
            _out_vec.push_back(_in_vec[i]);
        else if(_in_vec[i] == ")")
        {
            while(!tmp.empty() && tmp.back() != "(")
            {
                _out_vec.push_back(tmp.back());
                tmp.pop_back();
            }
            if(!tmp.empty())
                tmp.pop_back();
        }
        else if(_in_vec[i] == "+" || _in_vec[i] == "-")
        {
            if(!tmp.empty() && (tmp.back() == "*" || tmp.back() == "/"))
            {
                _out_vec.push_back(tmp.back());
                tmp.pop_back();
            }
            if(!tmp.empty() && (tmp.back() == "+" || tmp.back() =="-"))
            {
                _out_vec.push_back(tmp.back());
                tmp.pop_back();
            }
            tmp.push_back(_in_vec[i]);
        }
        else if(_in_vec[i] == "*" || _in_vec[i] == "/")
        {
            if(!tmp.empty() && (tmp.back() == "*" || tmp.back() == "/"))
            {
                _out_vec.push_back(tmp.back());
                tmp.pop_back();
            }
            tmp.push_back(_in_vec[i]);
        }
        else
            tmp.push_back(_in_vec[i]);
    }
    while(!tmp.empty())
    {
        _out_vec.push_back(tmp.back());
        tmp.pop_back();
    }
}

时间: 2024-10-07 23:43:01

数据结构-中序转后序的相关文章

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序

数据结构-二叉树(1)以及前序、中序、后序遍历(python实现)

上篇文章我们介绍了树的概念,今天我们来介绍一种特殊的树--二叉树,二叉树的应用很广,有很多特性.今天我们一一来为大家介绍. 二叉树 顾名思义,二叉树就是只有两个节点的树,两个节点分别为左节点和右节点,特别强调,即使只有一个子节点也要区分它是左节点还是右节点. 常见的二叉树有一般二叉树.完全二叉树.满二叉树.线索二叉树.霍夫曼树.二叉排序树.平衡二叉树.红黑树.B树这么多种类.我们这篇文章中简单介绍一般二叉树.完全二叉树和满二叉树. 一般二叉树 很简单,只要满足子节点数不超过两个的树就是一棵二叉树

树(二叉树)的建立和遍历算法(一)(前序,中序,后序)

最近学习树的概念,有关二叉树的实现算法记录下来... 不过学习之前要了解的预备知识:树的概念:二叉树的存储结构:二叉树的遍历方法.. 二叉树的存储结构主要了解二叉链表结构,也就是一个数据域,两个指针域,(分别为指向左右孩子的指针),从下面程序1,二叉树的存储结构可以看出. 二叉树的遍历方法:主要有前序遍历,中序遍历,后序遍历,层序遍历.(层序遍历下一篇再讲,本篇主要讲的递归法) 如这样一个二叉树: 它的前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左子树,再前序遍历右子树) 它

二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了.所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多. 四种主要的遍历思想为: 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子

2015-03-15---二叉树递归(非递归)实现先序、中序、后序遍历(附代码)

今天说好的不碰代码的,后来还是没忍住,学了学数据结构和算法,就先讲讲先序中序和后序遍历吧,我还写了代码,一套递归方式实现遍历二叉树,还有两套非递归方式遍历二叉树, 从简单的开始,因为二叉树的所有操作都是要求在能够遍历的基础上啊. 学过数据结构的肯定都明白遍历顺序, 先序遍历就是先自己,然后左子树,然后右子树, 中序遍历就是先左子树,然后自己,然后右子树 后序遍历就是先左子树,然后右子树,然后自己 比如上图这个很简单的二叉树: 先序遍历:1 2 4 5 3 6 7 中序遍历:4 2 5 1 6 3

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

二叉树前序遍历+中序遍历-&gt;后序遍历

BNU的基础题,数据结构的基础题,顺便搞下. 二叉树是一种常用的数据结构.我们可以用大写的英文字母表示二叉树的节点. 如下: B / \ / \ C A D 对于二叉树,有前序.中序和后序三种遍历方式. 现在给你一棵二叉树的前序和中序遍历,请你求出这棵二叉树的后序遍历结果. Input 输入数据有多组,每组数据一行. 每行由两个字符串组成(每个字符串长度最大为26).表示一棵二叉树的前序和中序遍历结果. 题目保证前序和中序遍历是合法的(即肯定可以确定一棵二叉树). Output 对于每组输入,输

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归

根据先序、中序、后序遍历还原二叉树

遍历方式的转至二叉树的四种遍历方式 首先我们要知道三种遍历方式的规律: 先序遍历:跟在前,子树的根在后,左子树比右子树考前,且第一个就是根节点. 中序遍历:左子树在根左边,右子树在根右边,左边的部分是根节点的左子树的中序遍 历序列,右边部分是根节点右子树的中序遍历序列. 后序遍历:根在后,子树在根前且左子树比右子树靠前,且最后一个节点是根节点. 一.先序+中序 根据先序序列的第一个元素建立根节点 在中序序列中找到该元素,确定根节点的左右子树的中序序列 在先序序列中确定左右子树的先序序列 由左子树