数据结构-栈的应用中缀转后缀(8)

算法思路:
遍历中缀表达式中的数字和符号
对于数字: 直接输出
对于符号: 
       左括号: 进栈
       运算符号:与栈顶符号进行优先级比较
                       若栈顶符号优先级高,此符号入栈
                       若栈顶符号优先级低,则将栈顶符号出栈并输出,之后此符号进栈
       右括号:将栈顶符号弹出并输出,直到匹配左括号
遍历结束: 将栈中的所有符号弹出并输出
// 栈的应用中缀转后缀算法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"LinkStack.h"      
#include<stdio.h>      
#include<stdlib.h>      
#include<string.h>    
#include"linklist.h"


int isNumber(char c)
{
	return('0'<=c) && (c<='9');
 }
int isOperator(char c)
{
	return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}
int isLeft(char c)
{
	return(c == ('('));
}
int isRight(char c)
{
	return(c == (')'));
}
void output(char c)
{
	if (c!='\0')
	{
		printf("%c",c);
	}
}
int priority(char c)
{
	int ret = 0;
	if ((c=='+')||(c=='-'))
	{
		ret = 1;

	}
	if ((c == '*') || (c == '/'))
	{
		ret = 2;
	}
	return ret;

}
void transform(const char* exp)
{
	int i = 0;
	LinkStack* stack = Stack_Create();
	while (exp[i]!='\0')
	{
		if (isNumber(exp[i]))
		{
			output(exp[i]);
		}
		else if (isOperator(exp[i]))
		{
			while (priority(exp[i])<=priority((char)(int)Stack_Top(stack)))
			{
				output((char)(int)Stack_Pop(stack));
			}
			Stack_Push(stack,(void*)(int)exp[i]);
		}
		else if(isLeft(exp[i]))
		{
			Stack_Push(stack, (void*)(int)exp[i]);
		}
		else if (isRight(exp[i]))
		{
			while (!isLeft((char)(int)Stack_Top(stack)))
			{
				output((char)(int)Stack_Pop(stack));
			}
			Stack_Pop(stack);
		}
		else
		{
			printf("invalid exp");
			break;
		}
		i++;
	}
	while (Stack_Size(stack)>0&&exp[i]=='\0')
	{
		output((char)(int)Stack_Pop(stack));
	}
	Stack_Destory(stack);
}

int main()
{
	transform("8+(3-1)*5");
	printf("\n");
	system("pause");
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值