数据结构-二叉树和堆栈

1.前期实验
失败原因:
(1)对于先序输入的式子理解不到位,导致在压栈错误
(2)&的用法????

#include <iostream>
#include <stack>
using namespace std;
void d(stack<int>&m)
{
    cout<<"fuck";
    cout<<m.top();
    m.pop();
}
int main ()
{
    stack<int> mystack;
    int sum (0);

    for (int i=1;i<=3;i++) mystack.push(i);

    d(mystack);
    cout<<"hh";
    cout<<mystack.top();
    return 0;
}
void Vaculcate(Tree T,stack<char>&smybol,stack<float>&number)
{
    if(!T)
        return;
    Vaculcate(T->lchild,smybol,number);
    Vaculcate(T->rchild,smybol,number);
    TreeNode *p=T;
        if(p->data>='0'&&p->data<='9')
        {
            float m=(float)(p->data-'0');
            number.push(m);
            cout<<"number"<<number.top()<<endl;
        }
        else
        {
            smybol.push(p->data);
            cout<<"char"<<smybol.top()<<endl;


        }
}
void Value(Tree T,stack<char>&smybol,stack<float>&number)
{
    Vaculcate(T,smybol,number);
    stack<float>answer;
    while(!number.empty()) {
        cout<<"no empty";
        float m, n;
        m = number.top();
        cout<<"m:"<<m<<endl;
        number.pop();
        n = number.top();
        cout<<"n:"<<n<<endl;
        number.pop();
        char x = smybol.top();
        cout<<"symbol:"<<x<<endl;
        smybol.pop();
        float term;
        switch (x) {
            case '+':
                term = m + n;
                cout << "answer:"<<term << endl;
                answer.push(term);
                break;
            case '-':
                term = n-m;
                cout << "answer:"<<term << endl;
                answer.push(term);
                break;
            case '*':
                term = m * n;
                cout <<"answer:"<< term << endl;
                answer.push(term);
                break;
            case '/':
                term = n/m;
                cout << "answer:"<<term << endl;
                answer.push(term);
                break;
            default:
                cout << "error";
        }
    }
}

3.计算表达式的值

#include <stdio.h>
#include <stack>
#include <iostream>
using namespace std;
stack<float>number;
stack<char>symbol;
int main() {
    char x[20];
    cin>>x;
    int i=0;
    int count=0;
    while(x[i-1]!='#') {
        if(count < 2) {
            if (x[i] >= '0' && x[i] <= '9') {
                count++;
                float m = (float) (x[i] - '0');
                number.push(m);
                cout << "number:" << m << endl;
            } else {
                symbol.push(x[i]);
                cout << "symbol:" << x[i] << endl;
            }
            i++;
        }
           else {
            count = 0;
            float term, a, b;
            a = number.top();
            number.pop();
            b = number.top();
            number.pop();
            char p;
            p = symbol.top();
            symbol.pop();
            cout << a << " " << b << " " << p << endl;
            switch (p) {
                case '+':
                    term = a + b;
                    number.push(term);
                    cout << term << endl;
                    break;
                case '-':
                    term = b -a;
                    number.push(term);
                    cout << term << endl;
                    break;
                case '*':
                    term = a * b;
                    number.push(term);
                    cout << term << endl;
                    break;
                case '/':
                    term = a / b;
                    number.push(term);
                    cout << term << endl;
                    break;
                default:
                    break;
            }
        }

    }
    cout<<endl;
    cout<<"最终运算:"<<endl;
        symbol.pop();
        char d = symbol.top();
        float a, b;
        a = number.top();
        b = number.top();
        cout<<a<<" "<<b<<endl;
        float term;
        switch (d) {
            case '+':
                term = a + b;
                number.push(term);
                cout <<"answer:"<< term << endl;
                break;
            case '-':
                term = a - b;
                number.push(term);
                cout << "answer:"<<term << endl;
                break;
            case '*':
                term = a * b;
                number.push(term);
                cout <<"answer:"<< term << endl;
                break;
            case '/':
                term = a / b;
                number.push(term);
                cout <<"answer:"<< term << endl;
                break;
            default:
                break;
        }
   return 0;
}

4.中序添加括号输出
(1)函数头文件以及自定义函数定义以及实现

//
// Created by fattytian on 17-11-22.
//

#ifndef UNTITLED11_TREE_H
#define UNTITLED11_TREE_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <stack>
#include <math.h>
#define MAX 100
using namespace std;
typedef char TElmeType;
typedef struct TreeNode
{
    TElmeType data;//数据存储
    struct TreeNode *lchild,*rchild,*parent;//左右孩子,父节点
}TreeNode,*Tree;
//创建
void Inittree(Tree *T)
{
    *T=NULL;
}
//销毁
void Detree(Tree *T)
{
    if(*T) {
        if((*T)->lchild)
            Detree(&(*T)->lchild);
        if((*T)->rchild)
            Detree(&(*T)->rchild);
        free(*T);
        *T=NULL;
    }
}
//创建一个表达式的树
void Build(Tree &T,TElmeType x) {
    TreeNode *newnode = new TreeNode;
    newnode->data = x;
    newnode->rchild = NULL;
    newnode->lchild = NULL;
    TreeNode *p;
    if (T == NULL) {
        T = newnode;
        newnode->parent = T;
        p = newnode;
    } else {
        if (x >= '0' && x <= '9') {
            if (p->lchild == NULL) {
                p->lchild = newnode;
                newnode->parent = p;
            } else {
                p->rchild = newnode;
                newnode->parent = p;
                p = p->parent;
            }
        } else {
            if (p->lchild != NULL) {
                p->rchild = newnode;
                newnode->parent = p;
                p = newnode;
            } else {
                p->lchild = newnode;
                newnode->parent = p;
                p = newnode;
            }

        }
    }
}
//前缀输出
void Expression(Tree T)
{
   // cout<<"中序输出:";
    if(!T)
        return;
    Expression(T->lchild);
    cout<<T->data;
    Expression(T->rchild);
}
//表达式
void Priexpression(Tree T)
{
    if(!T)
        return;
    else {
        TreeNode *p;
        p = T;
        cout << "完整表达式:"<<endl;
        while (p->lchild) {
            p = p->lchild;
        }

        while (p != T) {
            cout << "(";
            cout << p->data;
            p = p->parent;
            cout << p->data;
            cout << p->rchild->data;
            cout << ")";
            p = p->parent;
        }
        cout << p->data;
        p = p->rchild;
        while (p->lchild)
            p = p->lchild;
        while (p != T) {
            cout << "(";
            cout << p->data;
            p = p->parent;
            cout << p->data;
            cout << p->rchild->data;
            cout << ")";
            p = p->parent;
        }
    }
}

#endif //UNTITLED11_TREE_H

(2)main 函数

//
// Created by fattytian on 17-11-28.
//

#include "Tree.h"
stack<char>symbol;
stack<float>number;
int main()
{
    cout<<"please write your expression:";
    Tree tree;
    Inittree(&tree);
    TElmeType x[20];
    cin>>x;
    int i=0;
    int count=0;
    while(x[i]!='#')
    {
        Build(tree,x[i]);
        i++;
    }
    cout<<"表达式:"<<endl;
    Expression(tree);
    cout<<"\n";
    Priexpression(tree);
    return 0;
}

5.晚安,我会想到好的方法简化代码的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容