📜  中缀前缀使用 cpp 链表程序 - C++ 代码示例

📅  最后修改于: 2022-03-11 14:44:58.921000             🧑  作者: Mango

代码示例1
#include #include #include #include #define MAX 50struct infix{    char target[MAX] ;    char stack[MAX] ;    char *s, *t ;    int top, l ;} ; void initinfix ( struct infix * ) ;void setexpr ( struct infix *, char * ) ;void push ( struct infix *, char ) ;char pop ( struct infix * ) ;void convert ( struct infix * ) ;int priority ( char c ) ;void show ( struct infix ) ; void main( ){    struct infix q ;    char expr[MAX] ;    clrscr( ) ;    initinfix ( &q ) ;    printf ( "\nEnter an expression in infix form: " ) ;    gets ( expr ) ;    setexpr ( &q, expr ) ;    convert ( &q ) ;    printf ( "The Prefix expression is: " ) ;    show ( q ) ;    getch( ) ;}/* initializes elements of structure variable */void initinfix ( struct infix *pq ){    pq -> top = -1 ;    strcpy ( pq -> target, "" ) ;    strcpy ( pq -> stack, "" ) ;    pq -> l = 0 ;}/* reverses the given expression */void setexpr ( struct infix *pq, char *str ){    pq -> s = str ;    strrev ( pq -> s ) ;    pq -> l = strlen ( pq -> s ) ;    *( pq -> target + pq -> l ) = '\0' ;    pq -> t = pq -> target + ( pq -> l - 1 ) ;}/* adds operator to the stack */void push ( struct infix *pq, char c ){    if ( pq -> top == MAX - 1 )        printf ( "\nStack is full.\n" ) ;    else    {        pq -> top++ ;        pq -> stack[pq -> top] = c ;    }}/* pops an operator from the stack */char pop ( struct infix *pq ){    if ( pq -> top == -1 )    {        printf ( "Stack is empty\n" ) ;        return -1 ;    }    else    {        char item = pq -> stack[pq -> top] ;        pq -> top-- ;        return item ;    }}/* converts the infix expr. to prefix form */void convert ( struct infix *pq ){    char opr ;    while ( *( pq -> s ) )    {        if ( *( pq -> s ) == ' ' || *( pq -> s ) == '\t' )        {            pq -> s++ ;            continue ;        }        if ( isdigit ( *( pq -> s ) ) || isalpha ( *( pq -> s ) ) )        {            while ( isdigit ( *( pq -> s ) ) || isalpha ( *( pq -> s ) ) )            {                *( pq -> t ) = *( pq -> s ) ;                pq -> s++ ;                pq -> t-- ;            }        }        if ( *( pq -> s ) == ')' )        {            push ( pq, *( pq -> s ) ) ;            pq -> s++ ;        }        if ( *( pq -> s ) == '*' || *( pq -> s ) == '+' || *( pq -> s ) == '/' || *( pq -> s ) == '%' || *( pq -> s ) == '-' || *( pq -> s ) == '$' )        {            if ( pq -> top != -1 )            {                opr = pop ( pq ) ;                while ( priority ( opr ) > priority ( *( pq -> s ) ) )                {                    *( pq -> t ) = opr ;                    pq -> t-- ;                    opr = pop ( pq ) ;                }                push ( pq, opr ) ;                push ( pq, *( pq -> s ) ) ;            }            else                push ( pq, *( pq -> s ) ) ;                pq -> s++ ;        }        if ( *( pq -> s ) == '(' )        {            opr = pop ( pq ) ;            while ( opr != ')' )            {                *( pq -> t ) = opr ;                pq -> t-- ;                opr = pop ( pq ) ;            }            pq -> s++ ;        }    }    while ( pq -> top != -1 )    {        opr = pop ( pq ) ;        *( pq -> t ) = opr ;        pq -> t-- ;    }    pq -> t++ ;}/* returns the priotity of the operator */int priority ( char c ){    if ( c == '$' )        return 3 ;    if ( c == '*' || c == '/' || c == '%' )        return 2 ;    else    {        if ( c == '+' || c == '-' )            return 1 ;        else            return 0 ;    }}/* displays the prefix form of given expr. */void show ( struct infix pq ){    while ( *( pq.t ) )    {        printf ( " %c", *( pq.t ) ) ;        pq.t++ ;    }}