算法思路;
遍歷後綴表達式中的數字和符號
對數字:進棧
對於符號:
從棧中彈出右操作數
從棧中彈出左操作數
根據符號進行運算
將結果壓入棧中
遍歷結束: 棧中唯一數字爲計算結果。
// 棧的應用後綴表達式計算.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;
}