数据结构:栈实现逆波兰表达式


#include<bits/stdc++.h>
using namespace std;
char Treedata[20];
int n=0;
typedef struct BitNode{
    char data;
    struct BitNode *Lchild,*Rchild;
}BitNode,*BiTree;
typedef struct StackNode{
    int data ;
    struct StackNode *next;
}StackNode;
typedef struct Stack{
    StackNode *top;
    int length=0;
}Stack;
//初始化栈
Stack* Init_Stack(){
    Stack *s=new Stack;
    s->top=NULL;
    return s;
}
//入栈
void push(Stack *s,int c){
    StackNode *temp=new StackNode;
    temp->data=c;
    temp->next=s->top;
    s->top=temp;
    s->length++;
}
//出栈
int Pop(Stack *s)
{
    StackNode *temp=s->top;
    int data=temp->data;
    s->top=temp->next;
    s->length--;
    return data;
}
//创建二叉树
BiTree CreateBitree(){
    BiTree T;
    char c;
    cin>>c;
    if('#'==c) T=NULL;
    else{
        T=new BitNode;
        T->data=c;
        T->Lchild=CreateBitree();
        T->Rchild=CreateBitree();
    }
    return T;
}
//后续遍历储存
void LastTravere(BiTree T){
    if(T){
        LastTravere(T->Lchild);
        LastTravere(T->Rchild);
        Treedata[n++]=T->data;
    }
}
void BOrland(Stack *s,char T[20]){
    //cout<<T;
    int data1,data2,data3,temp;
    for(int k=0;k<n;k++){
        if(T[k]>='0'&&T[k]<='9')
            push(s,T[k]-'0');
        else{
            data1= Pop(s);
            //cout<<data1<<endl;
            data2= Pop(s);
            //cout<<data2<<endl;
            if(T[k]=='*')
                data3=data1*data2;
            else if(T[k]=='+')
                data3=data1+data2;
            else if(T[k]=='-')
                data3=data1-data2;
            else if(T[k]=='/')
                    data3=data1/data2;
            temp=data3;
            push(s,temp);//入栈到栈中只剩下一个数字
        }
    }
    cout<<Pop(s);//打印数字
}
int main(){
    cout<<"运算过程:";
    BiTree T=CreateBitree();
    LastTravere(T);//后序存储
    /*for(int k=0;k<n;k++){
        cout<<Treedata[k];
    }*/
    Stack *s=Init_Stack();
    BOrland(s,Treedata);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值