//p55页
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
void 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;
}
中序表达式转后序的代码
最新推荐文章于 2022-03-11 14:56:10 发布