中缀表达式转化为后缀表达式

转换方法:
1、数字直接输出。
2、运算符 ‘+’ 和 ‘-’:若栈为空直接入栈 ;若栈里面有除 ‘(’ 之外的其他运算符,将栈里面的运算符出栈直到遇到 ‘(’ 运算符或者栈空,之后再将 ‘+’ 或 '-'入栈。
3、运算符 ‘’ 和 ‘/’:若栈中有运算符 '’ 或 ‘/’,将栈中运算符弹出,再将其入栈;其余情况直接入栈。
4、运算符 ‘)’ :将栈中运算符弹出直到遇到 ‘(’ 。
5、运算符 ‘(’ 直接入栈。

在这里插入代码片#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXSIZE 1024    //初始化栈有1024个空间 


typedef char ElemType;


typedef struct
{
	ElemType *top;   //指向栈顶的指针变量 
	ElemType *base;  //指向栈底 的指针变量 
	int stackSize;   //栈可使用的最大容量 
}SeqStack;

//创建栈
void InitStack(SeqStack *s)
{
	s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	if(!s->base)
		exit(0);
	s->top=s->base;
	s->stackSize=MAXSIZE;
} 
 

//判断栈是否为空
int Isempty(SeqStack s)
{
	if(s.base==s.top)
		return 0;
	return 1;
} 


//返回栈顶元素
int SeqStack_Top(SeqStack *s)
{
	if(Isempty(*s))
	{
		
		int e=*--(s->top);
		s->top++;
		return e;
	}
		
	printf("栈为空返回失败\n");
	return -1;
}

//出栈 
void  Pop(SeqStack *s,ElemType *e)
{
	if(Isempty(*s))
	{
		*e=*--(s->top);
	}


}

//入栈
void Push(SeqStack *s,ElemType vue)
{
	if(s->top-s->base>=MAXSIZE)
	{
		s->base=(ElemType*)realloc(s->base,2*MAXSIZE*sizeof(ElemType));
		s->top=s->base+s->stackSize;
		s->stackSize=MAXSIZE*2;
		
	}
	*(s->top)=vue;	
	s->top++;
} 

//销毁栈
void Stack_Cleer(SeqStack *s)
{
	for(int i=0;i<s->stackSize;i++)
	{
		free(s->top--);
	}
	s->base=s->top=NULL;
	s->stackSize=0;
} 

//计算栈的当前容量 即栈中元素个数
int Stack_Len(SeqStack *s)
{
	return (s->top-s->base);
} 

//清空栈
void Stack_Clear(SeqStack *s) 
{
	s->top=s->base;
}


int main()
{
	SeqStack s;
	InitStack(&s);
	char c,e;
	printf("请输入中缀表达式:\n");
	scanf("%c",&c);
	while(c!='#')
	{
		while(isdigit(c))
		{
			printf("%c",c);
			scanf("%c",&c);
			if(c>'9'||c<'0')
			{
				printf(" ");
			}
		}
		
		
		if(c=='(')
		{
			Push(&s,c);
		}
		
		
		else if(c=='*'||c=='/')
		{
			if(!Isempty(s))
			{
				Push(&s,c);
			}
			else
			{
				Pop(&s,&e);
				if(e=='*'||e=='/')
				{
					printf("%c ",e);
				}
				else
				{
					Push(&s,e);
				}
				Push(&s,c);
			}
		}
		else if(c=='+'||c=='-')
		{
			if(!Isempty(s))
			{
				Push(&s,c);
			}
			else
			{
				do
				{
					Pop(&s,&e);
					if(e=='(')
					{
						Push(&s,e);
					}
					else
					{
						printf("%c ",e);
					}
				}while(e!='('&&Isempty(s));
				Push(&s,c);
			}
		}
		else if(c==')')
		{
	
			Pop(&s,&e);
			while(e!='(')
			{
				printf("%c ",e);
				Pop(&s,&e);
			}	
		}
		else if('#'==c)
		{
			break;
		}
		else
		{
			printf("输入错误\n");
		}
		
		scanf("%c",&c);
	}
	while(Isempty(s))
	{
		Pop(&s,&e);
		printf("%c",e);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值