中序表达式转后序的代码

来源:互联网 发布:人人商城源码 编辑:程序博客网 时间:2024/06/05 00:38
//p55页#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 20void intopostfix( char infix_q[], int rear);int compare( char stack_o, char infix_o );char infix_priority[9] = {'#', ')', '+', '-', '*', '/', '^', ' ', '(' };char stack_priority[8] = { '#', '(', '+', '-', '*', '/', '^', ' '};int main(){    int rear = -1;    char infix_q[MAX];//储存使用者输入中序者的队列    printf("****这里是分割线哟------------------------\n");    printf("使用的运算符\n");    printf(" ^: 指数\n");    printf(" *: 乘法     /: 除法\n");    printf(" +: 家法     -: 减法\n");    printf(" (: 左括号   ):右括号  ");    printf(" -----------这里依旧是分割线");    printf(" 请输入中缀表达式:\n");    /*while( infix_q[rear] != '\n' )        infix_q[++rear] = getchar();*/    gets(infix_q);    rear = strlen( infix_q );    infix_q[rear] = '#';//队列结束时插入#作为结束符号    // printf("后缀表达式:\n");    intopostfix( infix_q, rear);    printf("\n");    return 0;}void intopostfix(char infix_q[], int rear){    //printf("rear");    int top = 0,ctr, tag = 1;    char stack_t[MAX];    stack_t[top] = '#';    for(ctr = 0; ctr <= rear; ctr++)    {        switch( infix_q[ctr])        {        case ')'://输入是左括号时,输出堆栈内运算符,直至堆栈内为左括号            while( stack_t[top] != '(' )            {                printf("%c", stack_t[top--]);            }            top--;            break;        case '#'://输入#,堆栈内还未输出的运算符输出            while( stack_t[top] != '#' )            {                printf("%c", stack_t[top--]);            }            break;        case '(':        case '^':        case '*':        case '/':        case '+':        case '-':            while( compare( stack_t[top], infix_q[ctr] ) )//如果输入的运算符在表达式中的优先权,小于TOP在堆栈内所指向的运算符在堆栈中的优先权,则将堆栈所指运算符输出,若大于,则将输入运算符放入堆栈                printf(" %c",stack_t[top--]);            stack_t[++top] = infix_q[ctr];           // tag = 1;            break;        /*case '+'://这一段代码是从书上抄的,但是加上去就会出错,改完就对了,好开心,也就是说tag没有什么用处呀        case '-':            if( tag == 1 )            {                stack_t[++top] = infix_q[ctr];                tag = 2;            }            else            {                while( compare( stack_t[++top], infix_q[ctr]))                    printf("%c",stack_t[top--]);                stack_t[++top] = infix_q[ctr];                tag = 1;            }            break;*/        default:            printf(" %c", infix_q[ctr]);            /*if( tag == 2 )                printf(" %c",stack_t[top--]);            tag = 0;*/            break;        }    }}int compare( char stack_o, char infix_o ){    int index_s = 0, index_i = 0;    while( stack_priority[index_s] != stack_o)        index_s++;    while( infix_priority[index_i] != infix_o)        index_i++;    return (index_s/2) >= (index_i/2) ? 1 : 0;}

原创粉丝点击