中缀表达式转逆波兰表达式(后缀表达式)数据结构c语言

逆波兰表达式优势在于只需简单操作,入栈和出栈就可以搞定任何普通表达式的运算。
下面是代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//对于表达式(56-20)/(4+2),其后缀表达式为56#20#-4##2#+/
#
typedef struct {
	char data[100];
	int top;
}SqStack;
 void push(SqStack* ptr, char data)
{
	ptr->data[++ptr->top] = data;
}
 char GetTop(SqStack* ptr)
 {
	 return ptr->data[ptr->top];
 }
 void pop(SqStack* ptr)
 {
	 ptr->top--;
 }
 void trans(char* exp, char postexp[])
 {

	 char ch;
	 int i = -1;
	 SqStack ptr;
	 ptr.top = -1;
	 while (*exp != '\0')
	 {
		 switch (*exp)
		 {
		 case'(':
			 push(&ptr, *exp);
			 exp++;
			 break;
		 case')':
			 while (ptr.data[ptr.top]!= '(')
			 {				
				 ch=GetTop(&ptr);
				 pop(&ptr);
				 postexp[++i]=ch;//当遇到)时,所有的算法符号都要入后缀表达式了,这时也不用担心数字

			 }
			 pop(&ptr);
			 exp++;
			 break;
		 case '+':
		 case '-':
			 while (ptr.top != -1)
			 {
				 ch = GetTop(&ptr);
				 if (ch != '(')
				 {
					 postexp[++i] = ch;
					 pop(&ptr);
					 ch = GetTop(&ptr);
					 
				 }
				 else
				 {
					 break;
				 }
			 }
			 push(&ptr, *exp);
			 exp++; 
			 break;
		 case'*':
		 case'/':
			 while (ptr.top != -1)
			 {
				 ch=GetTop(&ptr);
				 if(ch=='*'||ch=='/')
				 {
					 postexp[++i] = ch; 
					 pop(&ptr);
					 ch = GetTop(&ptr);
				 }
				 else
				 {
					 break;
				 }
			 }
			 push(&ptr, *exp);
			 exp++;
			 break;
		 default:
			 while (*exp >= '0' && *exp <= '9')
			 {
				 postexp[++i] = *exp;
				 exp++;
	
			 }
			 postexp[++i] = '#';
			 break;
		 }

	 }
	 while (ptr.top != -1)
	 {
		 ch = GetTop(&ptr);
		 postexp[++i] = ch;
		 pop(&ptr);
	 }
	 postexp[++i] = '\0';
	 for (int k = 0; k <=strlen(postexp); k++)
	 {
		 printf("%c", postexp[k]);
	 }
 }
int main() {
	char zhongzhui[100];
	char exp[100]="(56-20)/(4+2)";
	trans(&exp, zhongzhui);
	return 0;
}

对于当前这个运算符号都是入栈操作,因为此时还没拿到关于它的第二个操作数,
所以是不断的对栈顶进行操作,下面是运行结果

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值