This source file includes following definitions.
- push
- pop
- mostra
- preced
- convert
- getresult
static char szCpostfixHpp[] = "$Id: cpostfix.hpp,v 1.1 2011/03/24 11:58:05 doug Exp $";
#ifdef POSTFIX
#define POSTFIX_NO_DEBUG 1
#define POSTFIX_DEBUG 2
#define BUFFER_SIZE 128
#define POSTFIX_SIZE 20
class CPostfix {
char m_infix[BUFFER_SIZE];
char m_output[BUFFER_SIZE];
char m_pilha[POSTFIX_SIZE];
int m_ele;
int m_tos;
int m_bDebug;
public:
CPostfix(int);
void push(int);
char pop(void);
void mostra(void);
int isempty(void);
int isfull(void);
int preced(char);
int convert(char *);
char * getresult(void);
};
CPostfix::CPostfix(int argc)
{
m_tos = 0;
m_ele = 0;
memset(m_output,0,sizeof(m_output));
memset(m_infix, 0,sizeof(m_infix));
memset(m_pilha,0,sizeof(m_pilha));
if(2 == argc) m_bDebug = 1;
else m_bDebug = 0;
}
void CPostfix::push(int ele)
{
m_pilha[m_tos]=ele;
m_tos++;
}
char CPostfix::pop(void)
{
m_tos--;
return(m_pilha[m_tos]);
}
void CPostfix::mostra(void)
{
if(0 == m_bDebug) return;
int x=m_tos;
printf("\n Elementos da pilha: ");
while(x!=0)
printf("%c, ",m_pilha[--x]);
}
int CPostfix::preced(char simb)
{
if (simb== '(') return 0;
if (simb== ')') return 0;
if (simb=='+' || simb=='-') return 1;
if (simb=='*' || simb=='/') return 2;
if (simb=='^') return 3;
return 0;
}
int CPostfix::convert(char *szInput)
{
int i=0;
int j=0;
int k=0;
int length = 0;
char temp = 0;
memset(m_output,0,sizeof(m_output));
memset(m_infix,0,sizeof(m_infix));
strcpy(m_infix,szInput);
length=strlen(m_infix);
for(i=0;i<length;i++) {
if(m_infix[i]!='+' &&
m_infix[i]!='-' &&
m_infix[i]!='*' &&
m_infix[i]!='/' &&
m_infix[i]!='^' &&
m_infix[i]!=')' &&
m_infix[i]!='(' ) {
m_output[j++]=m_infix[i];
if(1 == m_bDebug) {
printf("\n Elemento adicionado na expressao final : %c",m_infix[i]);
}
} else {
if(m_tos==0) {
push(m_infix[i]);
if(1 == m_bDebug) {
printf("\n Elemento adicionado na pilha :%c",m_infix[i]);
}
} else {
if(m_infix[i]!=')' &&
m_infix[i]!='(') {
if(preced(m_infix[i]) <=
preced(m_pilha[m_tos-1])) {
while (preced(m_infix[i]) &&
preced(m_infix[i]) <=
preced(m_pilha[m_tos-1])) {
temp=pop();
if(1 == m_bDebug) {
printf("\n Elemento retirado da pilha :%c",temp);
}
m_output[j++]=temp;
}
push(m_infix[i]);
if(1 == m_bDebug) {
printf("\n Elemento colocado na pilha :%c",m_infix[i]);
}
mostra();
} else {
push(m_infix[i]);
if(1 == m_bDebug) {
printf("\n Elemento adicionado na pilha : %c",m_infix[i]);
}
mostra();
}
} else {
if(m_infix[i]=='(') {
push(m_infix[i]);
if(1 == m_bDebug) {
printf("\n Elemento colocado na pilha : %c",m_infix[i]);
}
}
if(m_infix[i]==')') {
temp=pop();
while(temp!='(') {
m_output[j++]=temp;
temp=pop();
}
}
}
}
}
}
while(m_tos!=0) {
m_output[j++]=pop();
}
if(1 == m_bDebug) {
printf("\n\nA expressao final e : %s\n\n",m_output);
}
return EXIT_SUCCESS;
}
char * CPostfix::getresult(void)
{
return m_output;
}
#endif