數據結構-棧的應用 後綴計算

算法思路;
遍歷後綴表達式中的數字和符號

對數字:進棧
對於符號: 

             從棧中彈出右操作數
             從棧中彈出左操作數

             根據符號進行運算
             將結果壓入棧中

遍歷結束: 棧中唯一數字爲計算結果。

// 棧的應用後綴表達式計算.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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章