13、スタックケース1:接尾辞式
問題源とアルゴリズムの構想は「網易雲教室:データ構造実戦完全マニュアル(夏曹俊・丁宋濤)」に由来する.
接尾辞式の要件
スタックの論理を用いて簡単な接尾辞式を実現する(最も一般的な算術論理表現方法)
接尾辞式のシーケンススタック実装
接尾辞式は、以前に実装された「シーケンススタック」の様々な操作によって実装されます.
接尾辞式の要件
スタックの論理を用いて簡単な接尾辞式を実現する(最も一般的な算術論理表現方法)
接尾辞式のシーケンススタック実装
接尾辞式は、以前に実装された「シーケンススタック」の様々な操作によって実装されます.
/*
: , ;
:
1. , , ( )
2. , , ;
, ( , ), ,
a. ,
b. ,
,
3. , , , ,
,
*/
//
BOOL IsOperator(char ch)
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
return TRUE;
default:
return FALSE;
}
}
// (*、/ 2;+、- 1)
int GetOperatorPriority(char ch)
{
switch(ch)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// , , 0
int GetCurrentCalculatingResult(char ch, int operand1, int operand2)
{
switch(ch)
{
case '+':
return (operand2 + operand1);
case '-':
return (operand2 - operand1);
case '*':
return (operand2 * operand1);
case '/':
return (operand2 / operand1);
default:
return -1;
}
}
// ,
int main()
{
char expression[] = "8*9-4/2";
int index = 0;//
int opera = 0;//
int operand1 = 0;// 1
int operand2 = 0;// 2
SequentialStack* pSqOperatorStack;//
SequentialStack* pSqOperandStack;//
pSqOperatorStack = (SequentialStack*)malloc(sizeof(SequentialStack));
pSqOperandStack = (SequentialStack*)malloc(sizeof(SequentialStack));
InitialStack(pSqOperatorStack);
InitialStack(pSqOperandStack);
while(expression[index] != '\0' && expression[index] != '
')
{
if(IsOperator(expression[index]) == TRUE)
{
if(!IsEmptyStack(pSqOperatorStack))
{
while((GetOperatorPriority(expression[index])
<= GetOperatorPriority(pSqOperatorStack->nStack[pSqOperatorStack->pTop]))
&& (!IsEmptyStack(pSqOperatorStack)))
{
operand1 = PopStack(pSqOperandStack);
operand2 = PopStack(pSqOperandStack);
opera = PopStack(pSqOperatorStack);
PushStack(pSqOperandStack, GetCurrentCalculatingResult(opera, operand1, operand2));
}
}
PushStack(pSqOperatorStack, expression[index]);
}
else
{
PushStack(pSqOperandStack, expression[index] - 48);
}
index++;
}
while(!IsEmptyStack(pSqOperatorStack))
{
opera = PopStack(pSqOperatorStack);
operand1 = PopStack(pSqOperandStack);
operand2 = PopStack(pSqOperandStack);
PushStack(pSqOperandStack, GetCurrentCalculatingResult(opera, operand1, operand2));
}
printf("%d
", PopStack(pSqOperandStack));
DestroyStack(pSqOperatorStack);
DestroyStack(pSqOperandStack);
system("pause");
return 0;
}