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

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值