링크드 리스트를 사용 할 수 있고 배열을 사용 할 수도 있다.
#include <stdio.h>
#include <string.h>
#define MAX 100
#define TURE 1
#define FALSE 0
char OperatorStack[100];
char OperandStack[100];
int OperatorTop;
int OperandTop;
void InitializeStack(void);
void OperatorPush(char);
void OperandPush(int);
char OperatorPop(void);
int OperandPop(void);
int IsEmptyOperatorStack(void);
int IsEmptyOperandStack(void);
int GreaterOpr(char, char);
int Calculate(int, int, char);
void main(void)
{
char buf[80];
int len, i;
int opn1, opn2;
char opr, c;
char tmpopr;
InitializeStack();
strcpy(buf, "1 + 2 * (1 + 3)");
len = strlen(buf);
i=0;
while(i<len)
{
c=buf[i++];
if(c == ' ')
continue;
else if(c<='9' && c>='0')
OperandPush(c-'0');
else if(c=='+' || c=='-' || c=='*' || c== '/')
{
if(IsEmptyOperatorStack())
OperatorPush(c);
else
{
opr=OperatorPop();
if(GreaterOpr(opr, c))
{
opn2=OperandPop();
opn1=OperandPop();
opn1=Calculate(opn1, opn2, opr);
OperandPush(opn1);
OperatorPush(c);
}
else
{
OperatorPush(opr);
OperatorPush(c);
}
}
}
else if(c=='(')
{
OperatorPush(c);
}
else if(c==')')
{
do
{
tmpopr=OperatorPop();
if(tmpopr != '(')
{
opn2=OperandPop();
opn1=OperandPop();
opn1=Calculate(opn1, opn2, tmpopr);
OperandPush(opn1);
}
}
while(tmpopr !='(');
}
}
while(!IsEmptyOperatorStack()){
opn1=OperandPop();
opn2=OperandPop();
opr=OperatorPop();
opn1=Calculate(opn1, opn2, opr);
OperandPush(opn1);
}
printf("%s = %d\n", buf, OperandPop());
}
void InitializeStack(void)
{
OperatorTop = 0;
OperandTop = 0;
}
void OperatorPush(char opr)
{
OperatorStack[OperatorTop++] = opr;
}
void OperandPush(int opn)
{
OperandStack[OperandTop++] = opn;
}
char OperatorPop(void)
{
return OperatorStack[--OperatorTop];
}
int OperandPop(void)
{
return OperandStack[--OperandTop];
}
int IsEmptyOperandStack(void)
{
if(OperandTop == 0)
return TURE;
else
return FALSE;
}
int IsEmptyOperatorStack(void)
{
if(OperatorTop==0)
return TURE;
else
return FALSE;
}
int GreaterOpr(char opr1, char opr2)
{
if(opr1=='*' || opr1 == '/')
{
if(opr2=='+' || opr2=='-')
return TURE;
else
return FALSE;
}
else
return FALSE;
}
int Calculate(int opn1, int opn2, char opr)
{
switch(opr)
{
case '+':
opn1=opn1+opn2;
break;
case '-':
opn1=opn2-opn1;
break;
case '*':
opn1=opn1*opn2;
break;
case '/':
opn1=opn2/opn1;
break;
}
return opn1;
}
#include <stdio.h>
#include <string.h>
#define MAX 100
#define TURE 1
#define FALSE 0
char OperatorStack[100];
char OperandStack[100];
int OperatorTop;
int OperandTop;
void InitializeStack(void);
void OperatorPush(char);
void OperandPush(int);
char OperatorPop(void);
int OperandPop(void);
int IsEmptyOperatorStack(void);
int IsEmptyOperandStack(void);
int GreaterOpr(char, char);
int Calculate(int, int, char);
void main(void)
{
char buf[80];
int len, i;
int opn1, opn2;
char opr, c;
InitializeStack();
strcpy(buf, "1 + 2 * 3 - 1");
len = strlen(buf);
i=0;
while(i<len)
{
c=buf[i++];
if(c == ' ')
continue;
else if(c<='9' && c>='0')
OperandPush(c-'0');
else if(c=='+' || c=='-' || c=='*' || c== '/')
{
if(IsEmptyOperatorStack())
OperatorPush(c);
else
{
opr=OperatorPop();
if(GreaterOpr(opr, c))
{
opn2=OperandPop();
opn1=OperandPop();
opn1=Calculate(opn1, opn2, opr);
OperandPush(opn1);
OperatorPush(c);
}
else
{
OperatorPush(opr);
OperatorPush(c);
}
}
}
}
while(!IsEmptyOperatorStack()){
opn1=OperandPop();
opn2=OperandPop();
opr=OperatorPop();
opn1=Calculate(opn1, opn2, opr);
OperandPush(opn1);
}
printf("%s = %d\n", buf, OperandPop());
}
void InitializeStack(void)
{
OperatorTop = 0;
OperandTop = 0;
}
void OperatorPush(char opr)
{
OperatorStack[OperatorTop++] = opr;
}
void OperandPush(int opn)
{
OperandStack[OperandTop++] = opn;
}
char OperatorPop(void)
{
return OperatorStack[--OperatorTop];
}
int OperandPop(void)
{
return OperandStack[--OperandTop];
}
int IsEmptyOperandStack(void)
{
if(OperandTop == 0)
return TURE;
else
return FALSE;
}
int IsEmptyOperatorStack(void)
{
if(OperatorTop==0)
return TURE;
else
return FALSE;
}
int GreaterOpr(char opr1, char opr2)
{
if(opr1=='*' || opr1 == '/')
{
if(opr2=='+' || opr2=='-')
return TURE;
else
return FALSE;
}
else
return FALSE;
}
int Calculate(int opn1, int opn2, char opr)
{
switch(opr)
{
case '+':
opn1=opn1+opn2;
break;
case '-':
opn1=opn2-opn1;
break;
case '*':
opn1=opn1*opn2;
break;
case '/':
opn1=opn2/opn1;
break;
}
return opn1;
}