【数据结构】利用栈 求解表达式

该博客探讨了如何利用栈的数据结构来解决表达式的计算问题,涉及加、减、乘、除及取整等运算。具体内容可通过代码实现查看。
摘要由CSDN通过智能技术生成

表达式求值问题,其中运算符号只包含 加减乘除 取整数 详细请参见代码:


#include <stdio.h>

#define MAX_SIZE 100

typedef struct 
{
	int top;
	char data[MAX_SIZE];
}NumStack;

typedef struct 
{
	int top;
	char opera[MAX_SIZE];
}OperaStack;

const char perior[5][5] = 
{
	'>','>','<','<','>',
	'>','>','<','<','>',
	'>','>','>','>','>',
	'>','>','>','>','>',
	'<','<','<','<','<',
};

void NumPush(NumStack* L,int elem);
void OperaPush(OperaStack* L, char elem);
int NumPop(NumStack* L);
char OperaPop(OperaStack* L);
char comp_perior(char a,char b);
int compute(int a,int b,char c);
int pe2int(char a);

void main()
{
	int i = 0;
	int j = 0;
	int num = 0;
	char expression[20] = "14+13-2*9+24/3=";

	NumStack Num_stack = {0,};
	OperaStack Opera_stack = {0,};

	while (expression[i] != '\0')
	{
		switch (expression[i])
		{
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			num = 10*num + (expression[i]-'0');
			break;
		case '=':
			if (expression[i+1] != '\0')
				return;
		case '+':
		case '-':
		case '*':
		case '/':
			NumPush(&Num_stack,num);

			if (Opera_stack.top == 0 || comp_perior(Opera_stack.opera[Opera_stack.top-1],expression[i]) == '<')
				OperaPush(&Opera_stack,expression[i]); // 栈空时直接入栈
			else 
			{
				do
				{
					int temp = compute(NumPop(&Num_stack),NumPop(&Num_stack),OperaPop(&Opera_stack));
					NumPush(&Num_stack,temp);
				}while (comp_perior(Opera_stack.opera[Opera_stack.top-1],expression[i]) == '>');

				OperaPush(&Opera_stack,expression[i]);
			}

			num = 0;
			break;
		}
		i++;
	}

	printf("计算的结果 = %d\n",Num_stack.data[Num_stack.top-1]);
}

void NumPush(NumStack* L,int elem)
{
	if (L->top+1 < MAX_SIZE)
		L->data[L->top++] = elem;
}


void OperaPush(OperaStack* L, char elem)
{
	if ((L->top+1) < MAX_SIZE)
		L->opera[L->top++] = elem;
}


int NumPop(NumStack* L)
{
	if (L->top == 0)
		return -1;

	return (L->data[--L->top]);
}


char OperaPop(OperaStack* L)
{
	if (L->top == 0)
		return -1;

	return (L->opera[--L->top]);
}

char comp_perior(char a,char b)
{
	return perior[pe2int(a)][pe2int(b)];
}

int pe2int(char a)
{
	switch (a)
	{
	case '+':
		return 0;
	case '-':
		return 1;
	case '*':
		return 2;
	case '/':
		return 3;
	case '=':
		return 4;
	default:
		return -1;
	}
}

int compute(int a,int b,char c)
{
	switch(c)
	{
	case '+':
		return a+b;
	case '-':
		return a-b;
	case '*':
		return a*b;
	case '/':
		return a/b;
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值