数据结构-栈的应用 后缀计算

算法思路;
遍历后缀表达式中的数字和符号

对数字:进栈
对于符号: 

             从栈中弹出右操作数
             从栈中弹出左操作数

             根据符号进行运算
             将结果压入栈中

遍历结束: 栈中唯一数字为计算结果。

// 栈的应用后缀表达式计算.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 express(int left,int right,char op)
{
	int ret = 0;
	switch (op)
	{
	case'+':
		ret = left + right;
		break;
	case'-':
		ret = left - right;
		break;
	case'*':
		ret = left * right;
		break;
	case'/':
		ret = left / right;
		break;
	default:
		break;
	}
	return ret;
}
int computer(const char* exp)
{
	LinkStack* stack = Stack_Create();
	int ret = 0;
	int i = 0;
	while (exp[i]!='\0')
	{
		if (isNumber(exp[i]))
		{
			Stack_Push(stack, (void*)(int)exp[i]);
		}
		else if (isOperator(exp[i]))
		{
			int right = (int)Stack_Pop(stack);
			int left = (int)Stack_Pop(stack);
			int result = express(left, right, exp[i]);
				Stack_Push(stack,(void*)result);
		}
		else
		{
			printf("invalid expression");
			break;
		}
		i++;
	}
	if (Stack_Size(stack)==1&&exp[i]=='\0')
	{
		ret = (int)Stack_Pop(stack);
	}
	else
	{
		printf("Invalid expression");
	}
	Stack_Destory(stack);
	return ret;
}
int main()
{
	int res= computer("831-5*+");
	printf("8+(3-1)*5=%d\n",res);
	system("pause");
    return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_36455036/article/details/80516697