小白易懂:中缀表达式(正常表达式)转换为 后缀表达式(逆波兰表达式)

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 

typedef struct StackNode {
    
    
	char data;//数据域 
	struct StackNode* next;//指针域 
}StackNode, * StackLink;//用于指向该类型结构体 

typedef struct StackNodePre node;

struct StackNodePre {
    
    
	StackLink top;// 栈顶指针 
	int amount;//计算栈内元素的数量 
};
//传入栈顶指针和压入值
node* Push(node* S, char PushAmount)//入栈 
{
    
    
	if (S->amount == 0) {
    
    //栈为空 
		StackNode* p = (StackNode*)malloc(sizeof(StackNode));
		if (p) {
    
    
			S->top = p;//指向p空间
			p->next = NULL;//空
			p->data = PushAmount;//赋值
			++S->amount;//栈内元素减一
		}

		return S;
	}
	else {
    
    
		StackNode* p = (StackNode*)malloc(sizeof(StackNode));
		if (p) {
    
    //上同
			p->next = S->top;
			p->data = PushAmount;
			S->top = p;
			++S->amount;
		}

		return S;
	}

}

node* Pop(node* S)//出栈
{
    
    
	if (S->amount == 0) {
    
    
		return S;
	}
	else {
    
    
		StackLink p;
		p = S->top;//保存
		if (S->top->data != '(') {
    
    
             printf(" %c", p->data);//出栈
		}
		
		S->top = S->top->next;//移动栈顶指针 
		free(p);//释放空间
		--S->amount;
		return S;
	}

}

int main()
{
    
    	
	int i, flag=1;//此处flag变量可删除,其作用是区分上一个字符,以便将十位以上的数字与个位数字区分
	char midExpression[21];//中缀表达式

	node* p = (node*)malloc(sizeof(node));//创一栈顶指针
	if (p) {
    
    //初始化
		p->top = NULL;
		p->amount = 0;
		/*请注意:输入时请把输入法调成英文模式*/
		scanf_s("%s", midExpression, 19);
		midExpression[20] = '\0';
		printf("\n");
		for (i = 0; midExpression[i] != '\0'; i++) {
    
    
			if (midExpression[i] >= '0' && midExpression[i] <= '9') {
    
    //判断是否在0~9之间
				if (flag == 1) {
    
    //区分十位以上数字和个位数
                    printf("%c", midExpression[i]);
				}
				else {
    
    
					printf(" %c", midExpression[i]); flag = 1;
				}
			}
			else if (midExpression[i] == '(') {
    
    //判断是否为左括号
				p = Push(p, midExpression[i]); flag = 0;
			}
			else if (midExpression[i] == ')') {
    
    //判断是否为右括号
				while (p->amount && p->top->data != '(') {
    
    
					p = Pop(p);
				}
				p = Pop(p);
				flag = 0;
			}
			else if (midExpression[i] == '*' || midExpression[i] == '/') {
    
    //判断是否为*或/

				if ( p->amount == 0 || p->top->data == '(' || p->top->data == '+' || p->top->data == '-') {
    
    
					p = Push(p, midExpression[i]); //入栈
				}
				else if (p->top->data == '*' || p->top->data == '/') {
    
    
					while (p->amount!=0&&(p->top->data=='*'||p->top->data=='/')) {
    
    
						p = Pop(p);//如果优先级比该运算符大或相等,则出栈
				    }
					p = Push(p, midExpression[i]);//再将该运算符其入栈
				}
				flag = 0;
			}
			else if (midExpression[i] == '+' || midExpression[i] == '-') {
    
    //判断是否为+或-
				if (p->amount == 0 || p->top->data == '(') {
    
    
					p = Push(p, midExpression[i]);//入栈
				}
				else if (p->top->data == '+' || p->top->data == '-' || p->top->data == '*' || p->top->data == '/') {
    
    
					while (p->amount != 0 &&( p->top->data == '*' || p->top->data == '/' || p->top->data == '+' || p->top->data == '-')) {
    
    
						p = Pop(p);//如果优先级比该运算符大或相等,则出栈
					}
					p = Push(p, midExpression[i]);//再将该运算符入栈
				}
				flag = 0;
			}
		}
		while (p->amount) {
    
    //将剩余的栈内运算符弹出
			p = Pop(p);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_52001969/article/details/113530270