此表达式求值程序利用Stack实现

/**//******************************
Date:
2006 - 10 -24
Description:
This programe is aiming to
carry out operator counting by
using of sequence stack
*******************************/
#include "stdio.h"
#define MAXSIZE 128
typedef char DataType;
int pIFX = 0;
int pPFX = 0;
int pTP = 0;

/**//***Define a Stack Struct***/
typedef struct 
...{
DataType stack[MAXSIZE];
}SeqStack;
/**//**********初始化PFX IFX************/
SeqStack PFX;
SeqStack IFX;
SeqStack TP;

/**//***************************
Function: Stack push
Param: SeqStack ss, char dat
Return: SeqStack
****************************/
SeqStack Push(SeqStack s, char dat)
...{
s.stack[pPFX] = dat;
return s;
} 
/**//***************************
Function: Stack pop
Param: SeqStack ss, char dat
Return: SeqStack
****************************/
SeqStack Pop(SeqStack s, char dat)
...{
}
int CtoD(char c)
...{
return(c - '0');
}
char DtoC(int x)
...{
return(x + 48);
} 
char InputPression(void)
...{
int i = 0;
char ch;
scanf("%c",&ch);
while(ch!= '=')
...{
IFX.stack[i ++] = ch;
scanf("%c",&ch);
}
IFX.stack[i] = '=';
}
void PrintStack(SeqStack s)
...{
int i = 0;
while(s.stack[i] != '=')
printf("%c",s.stack[i++]);
getchar();
getchar();
}
SeqStack toSufix()
...{
int pIFX = 0;
char ch;
TP.stack[pTP++] = '=';
while(IFX.stack[pIFX]!= '=')
...{
ch = IFX.stack[pIFX];
switch(ch)
...{
case '0':case '1':case '2':case '3':
case '4':case '5':case '6':case '7':
case '8': case'9':
PFX.stack[pPFX++] = ch;
break;
case '(':
TP.stack[++pTP] = '(';
break;
case ')':
while(TP.stack[pTP] != '(')
...{
PFX.stack[pPFX++] = TP.stack[pTP];
pTP--;
}
pTP--;
break;
case '+':
case '-':
while(
(pTP > 1 && TP.stack[pTP] != '(') &&
(TP.stack[pTP]== '+' || TP.stack[pTP]== '-')
)
PFX.stack[pPFX++] = TP.stack[pTP--];
pTP ++;
TP.stack[pTP]= ch;
break;
case '*':
case '/':
while(
pTP > 1 &&
(TP.stack[pTP]== '*' || TP.stack[pTP]== '/')
)
PFX.stack[pPFX++] = TP.stack[pTP--];
pTP++;
TP.stack[pTP] = ch;
break; 
}/**//*end switch*/
pIFX++; 
}/**//*end while*/
while(pTP > 1)
PFX.stack[pPFX++] = TP.stack[pTP--];
PFX.stack[pPFX] = '=';
}
int Computing() 
...{
char ch;
char tmp1;
char tmp2;
int tmp;
pPFX = 0;
pIFX = 0;
pTP = 0;
while(PFX.stack[pPFX]!= '=')
...{
ch = PFX.stack[pPFX];
switch(ch)
...{
case '0':case '1':case '2':case '3':
case '4':case '5':case '6':case '7':
case '8': case'9':
pTP++;
TP.stack[pTP] = ch;
break;
case '+':
tmp1 = TP.stack[pTP--];
tmp2 = TP.stack[pTP--];
tmp = CtoD(tmp1) + CtoD(tmp2);
TP.stack[++pTP] = DtoC(tmp);
break;
case '-':
tmp1 = TP.stack[pTP--];
tmp2 = TP.stack[pTP--];
tmp = CtoD(tmp1) - CtoD(tmp2);
TP.stack[++pTP] = DtoC(tmp);
break;
case '*':
tmp1 = TP.stack[pTP--];
tmp2 = TP.stack[pTP--];
tmp = CtoD(tmp1) * CtoD(tmp2);
TP.stack[++pTP] = DtoC(tmp);
break;
case '/':
tmp1 = TP.stack[pTP--];
tmp2 = TP.stack[pTP--];
tmp = CtoD(tmp1) / CtoD(tmp2);
TP.stack[++pTP] = DtoC(tmp);
break;

}/**//*end switch*/
pPFX ++;
}/**//*end while*/
return(CtoD(TP.stack[1]));
}


/**//******************************
Main Function
*******************************/
int main()
...{
printf("Input count pression: ");
InputPression();
PrintStack(IFX);
PFX = toSufix();
PrintStack(PFX);
printf("%d",Computing());
getchar();
}

5657

被折叠的 条评论
为什么被折叠?



