加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 06:30:37 所属栏目:安全 来源:网络整理
导读:表达式求值问题,其中运算符号只包含 加减乘除 取整数 详细请参见代码: #include stdio.h#define MAX_SIZE 100typedef struct {int top;char data[MAX_SIZE];}NumStack;typedef struct {int top;char opera[MAX_SIZE];}OperaStack;const char perior[5][5]

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


#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] != '')
	{
		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] != '')
				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("计算的结果 = %dn",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,char c)
{
	switch(c)
	{
	case '+':
		return a+b;
	case '-':
		return a-b;
	case '*':
		return a*b;
	case '/':
		return a/b;
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读