栈之中缀表达式转换为后缀表达式

本文介绍了一种使用栈将中缀表达式转换为后缀表达式的算法实现。该算法通过扫描输入的中缀表达式,利用栈来处理操作数和操作符,并输出对应的后缀表达式。文章提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

规则:

转换过程需要用到栈,具体过程如下:

1)如果遇到操作数,我们就直接将其输出。

2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。

3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。

4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。

5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。



#include<iostream>
#include "stdlib.h"
#include<cmath>
using namespace std;
#define STACK_SIZE 100
#define STACKINCREMENT 10
#define MAXBUFFER 10//输入单个数长度最大值
typedef char ElemType;

struct sqStack
{
	ElemType *top;
	ElemType *base;
	int  stackSize;
};
void InitStack(sqStack *s)
{
	s->base=(ElemType*)malloc(sizeof(ElemType)*STACK_SIZE);
	if(!s->base)
		exit(0);
	s->top=s->base;
	s->stackSize=STACK_SIZE;

}

void Push(sqStack *s,ElemType e)
{
	if(s->top-s->base>=s->stackSize)
	{
		s->base=(ElemType*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
		if(!s->base)
		    exit(0);
		s->top=s->base+s->stackSize;
		s->stackSize=s->stackSize+STACKINCREMENT;
	}
	*(s->top)=e;
	s->top++;
	
}
void Pop(sqStack *s,ElemType *e)
{
	if(s->top==s->base)
		return;
	s->top--;
	*e=*(s->top);


}


//计算栈的当前容量
int Stacklen(sqStack *s)
{
	return (s->top-s->base);
}


int main()
{
	sqStack s;
	char c,e;
	InitStack(&s);
	printf("请输入中缀表达式,以#表示结束:");
	scanf("%c",&c);
	while(c!='#')
	{
		while(c>='0'&&c<='9')//判断是数字的话,输出,且进一步判断是否为连续数字,比如10,此时不打空格
		{
			printf("%c",c);
			scanf("%c",&c);	
			if(c<'0'||c>'9')
			{
				printf(" ");//跳出循环后,判断c是否为'#'。
			}
		}
	    if(c==')')
		{
			Pop(&s,&e);
			while(e!='(')
			{
				printf("%c ",e);
				Pop(&s,&e);
			}
		}
		else if(c=='+'||c=='-')//把之前进栈的运算符弹出(在'('内)
		{
			if(!Stacklen(&s))
				Push(&s,c);
			else
			{
				do
				{
					Pop(&s,&e);
					if(e=='(')
						Push(&s,e);
					else
						printf("%c ",e);

					
				}while(Stacklen(&s)&&e!='(');	 
				Push(&s,c);

			}
		}
		else if(c=='*'||c=='/'||c=='(')
			Push(&s,c);
		else if(c=='#')
			break;
		else
		{
			printf("输入错误!");
			return -1;
		}


		scanf("%c",&c);

	}
	while(Stacklen(&s))
	{
		Pop(&s,&e);
		printf("%c ",e);
	}
	return 0;

}

运行:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值