美文网首页
数据结构-二叉树和堆栈

数据结构-二叉树和堆栈

作者: Fattyu | 来源:发表于2017-12-05 00:54 被阅读0次

    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.晚安,我会想到好的方法简化代码的。

    相关文章

      网友评论

          本文标题:数据结构-二叉树和堆栈

          本文链接:https://www.haomeiwen.com/subject/gtafixtx.html