栈实现中缀表达式转为后缀表达式

#include<stdio.h>
#include<stdlib.h>
#include"zhong.h"
typedef struct 
{
	char data[100];
	int top;
}SeqStack,*PSeqStack;
//栈的基本操作
PSeqStack Init_seqstack()
{
	PSeqStack S;
	S=(PSeqStack )malloc(sizeof(SeqStack));
	if(S)
		S->top=-1;
	return S;
}
int Empty_Seqstack(PSeqStack S)
{
	if(S->top==-1)
		return 1;
	else
		return 0;
}
int Push_seqstack(PSeqStack S,char x)
{
	if(S->top==100-1)
		return 0;
	else
	{
		S->top++;
		S->data[S->top]=x;
        return 1;
	}		
}
int Pop_seqstack(PSeqStack S,char *x)
{
	if(Empty_Seqstack(S))
		return 0;
	else
	{
		*x=S->data[S->top];
		S->top--;
		return 1;
	}
}
int  GetTop_seqstack(PSeqStack S,char *x)
{
	if(Empty_Seqstack(S))
		return 0;
	else
		*x=S->data[S->top];
	return 1;
}
void Destroy_seqstack(PSeqStack *S)
{
	if(*S)
		free(*S);
	*S=NULL;
	return ;
}
//以上是栈的基本操作
int IsNum(char c)
{//判断字符是否是数字
	if(c>='0'&&c<='9')
		return 1;
	else
		return 0;
}
int Priority(char op)
{//判断是否是操作符,并定义优先级
	switch(op)
	{
	case '=': return 1;
	case ')': return 2;
	case '+': 
	case '-': return 3;
	case '*':
	case '/': return 4;
	case '(': return 5;
	default:  return 0;
	}
}
int infix_exp_value(char *inf,char *pos)
{//中缀转化为后缀表达式
	PSeqStack S;
	char c,w,topelement;
	S=Init_seqstack();//创建一个栈
	if(!S)
	{
		printf("栈的初始化失败!");
		return 0;
	}
	Push_seqstack(S,'=');//将=压入栈中
	w=*inf;
	while((GetTop_seqstack(S,&c),c)!='='||w!='=')
	{//遇到操作数则直接输出,w后移一位
		if(IsNum(w))
		{
			*pos=w;
			pos++;
			w=*(++inf);
		}
		else//如果不是操作符,则根据优先级判断是出栈还是圧栈
		{
			if((GetTop_seqstack(S,&c),c)=='('&&w==')')
			{//满足(),则脱括号
				Pop_seqstack(S,&topelement);//出栈
				w=*(++inf);//w后移
			}
			else
			{
				if((GetTop_seqstack(S,&c),c)=='('||Priority((GetTop_seqstack(S,&c),c))<Priority(w))
				{//如果栈顶是(或者栈顶优先级小于当前优先级,则当前操作符圧栈
					Push_seqstack(S,w);
					w=*(++inf);
				}
				else
				{//如果栈顶的优先级大于w的优先级,则出栈
					Pop_seqstack(S,&topelement);
					*pos=topelement;
					pos++;
				}
			}
		}
	}
	*pos='=';
	*(++pos)='\0';
	Destroy_seqstack(&S);
	return 1;
}
double pos(char *A)
{//后缀表达式计算
	PSeqStacki S;
	double result,a,b,c;
//	char a,b,c;
	char ch;
	ch=*A++;
	S=Init_seqstacki();
	while(ch!='=')
	{
		if(IsNum(ch))
			Push_seqstacki(S,ch-'0');
		else
		{
			Pop_seqstacki(S,&a);
			Pop_seqstacki(S,&b);
			switch(ch)
			{
			case '+': c=a+b;break;
			case '-': c=a-b;break;
			case '*': c=a*b;break;
			case '/': c=a/b;break;
			case '%': c=(int)a%(int)b;break;
			}
		 Push_seqstacki(S,c);
		}
		ch=*A++;
	}
	GetTop_seqstacki(S,&result);
	Destroy_seqstacki(&S);
	return result;
}
int main()
{
	char a[100],b[100];
	double x;
	printf("请输入要计算的表达式:");
  	scanf("%s",a);
	getchar();
	infix_exp_value(a,b);
	x=pos(b);
	printf("%.2lf\n",x);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值