中序表达式转换为后序、前序表达式(非计算)

中序转换成后序:对每一个字符进行判断,并用一个栈存优先级较高的字符,符合规则的进队列,最后队列从队首至队尾输出。
中序转换成后序:先用一个栈ks存下整个表达式,然后从栈顶(表达式最尾端)开始判断, 一个栈qs存优先级高的字符,符合规则的进入栈os。ks表达式判断完后,qs中还会有字符未出栈,需要全部进行出栈处理。完毕后,输出栈os。

写的比较复杂,也怪老师的给的太繁琐。

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#define stacksize 100
#define queuesize 100
using namespace std;
typedef char datatype;
//定义队列
typedef struct
{
    char data[100];
    int front,rear;
}seqqueue;

//定义栈
typedef struct
{
    datatype data[100];
    int top;
}seqstack;

//初始化队列
void initqueue(seqqueue *q)
{
    q->front=0;
    q->rear=0;
}

//队列是否为空
int queueempty(seqqueue *q)
{
    if(q->front==q->rear)
        return 1;
    else
        return 0;
}

//入队列
void enqueue(seqqueue *q,datatype x)
{
    if((q->rear+1)%queuesize==q->front)
        cout<<"queue overflow"<<endl;
    else
    {
        q->data[q->rear]=x;
        q->rear=(q->rear+1)%queuesize;
    }
}

//出队列
datatype dequeue(seqqueue *q)
{
    if(q->front==q->rear)
        cout<<"queue empty"<<endl;
    else
    {
        datatype x;
        x=q->data[q->front];
        q->front=(q->front+1)%queuesize;
        return x;
    }
   // return NULL;
}

//初始化栈
void initstack(seqstack *s)
{
    s->top=0;
}

//入栈
void push(seqstack *s,datatype x)
{
    if(s->top==stacksize)
        cout<<"stack overflow"<<endl;
    else
    {
        s->data[s->top]=x;
        s->top=s->top+1;
    }

}

//出栈
datatype pop(seqstack *s)
{
    if(s->top==0)
        cout<<"stack underflow"<<endl;
    else
        return s->data[--s->top];
}

//取栈顶元素
datatype gettop(seqstack *s)
{
    if(s->top==0)
         return false;
    else
        return s->data[s->top-1];
}

//给运算符排序
int priority(datatype op)
{
    switch(op)
    {
        case '(':
        case ')':
        case '#': return 0;
        case '-':
        case '+': return 1;
        case '*':
        case '/': return 2;
    }
    return -1;
}

//中转后
void intopostexp()
{
    cout<<"中序转后序表达式"<<endl;
    cout<<"输入:"<<endl;
    seqqueue *q;
    seqqueue postq;
    q=&postq;
    initqueue(q);
    seqstack os;
    char c,t;
    seqstack *s;
    s=&os;
    initstack(s);;
    push(s,'#');
    do
    {
        c=getchar();
        switch(c)
        {
            case ' ': break;
            case '()':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9': enqueue(q,c);

            break;

            case '(':
                push(s,c);
                break;
            case')':
            case'#':
                do
                {
                    t=pop(s);
                    if(t!='('&&t!='#')
                        enqueue(q,t);
                }while(t!='('&&s->top!=0);
                break;
           case '+':
           case '-':
           case '*':
           case '/':
               while(priority(c)<=priority(gettop(s)))
               {
                   t=pop(s);
                   enqueue(q,t);
               }
               push(s,c); break;
        }
    }while(c!='#');
    while(!queueempty(q))
        cout<<dequeue(q)<<" ";
    cout<<endl;
}

//中转前
void xiang()
{
    cout<<"中序转前序表达式"<<endl;
    cout<<"输入:"<<endl;
    seqstack os,ks,qs;
    seqstack *s,*k,*q;
    s=&os;
    k=&ks;
    q=&qs;
    initstack(q);
    initstack(s);
    initstack(k);
    char abc;
    push(k,'#');
    push(q,'#');
    push(s,'#');
    while(cin>>abc)
    {
        push(k,abc);
        if(abc=='#') break;
    }

    pop(k);
    char c,t;
    do
    {
        c=pop(k);
        switch(c)
        {
            case ' ': break;
            case '()':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9': push(s,c);

            break;

            case ')':
                push(q,c);
                break;
            case'(':
            case'#':
                do
                {
                    t=pop(q);
                    if(t!=')'&&t!='#')
                        push(s,t);
                }while(t!=')'&&s->top!=0);
                break;
           case '+':
           case '-':
           case '*':
           case '/':
               while(priority(c)<=priority(gettop(q)))
               {
                   t=pop(q);
                   push(s,t);
               }
               push(q,c);break;
        }
    }while(gettop(k)!='#');

    while(gettop(q)!='#')
    {
        t=pop(q);
        push(s,t);
    }
    while(gettop(s)!='#')
    {
        char t=pop(s);
        cout<<t<<" ";
    }
    cout<<endl;
}
int main()
{
    //5+6-2*(5-6)-6/2#
    intopostexp();
    xiang();
    return 0;
}




猜你喜欢

转载自blog.csdn.net/curiosity9/article/details/83413609