# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# define INIT_STACK_SIZE 10
typedef struct
{
int * top;
int * base;
int stacksize;
}* PSTACK, STACK;
void init (PSTACK pS)
{
pS->base = (int *)malloc(sizeof(int) * INIT_STACK_SIZE);
if (!pS->base)
{
printf("内存分配失败!\n");
exit(-1);
}
pS->top = pS->base;
pS->stacksize = INIT_STACK_SIZE;
return;
}
void pushNS (PSTACK pNS, char ch)
{
*(pNS->top++) = ch;
return;
}
void pushOS (PSTACK pOS, PSTACK pNS, char ch)
{
bool change = false;
char c = *(pOS->top - 1);
if ((c == '+' || c == '-') && (ch == '*' || ch == '/'))
{
change = true;
}
if (change || ch == '(' || c == '(' || pOS->top == pOS->base)
{
*(pOS->top++) = ch;
}
else if (ch == ')')
{
while (*(pOS->top - 1) != '(')
{
pushNS(pNS, *(--pOS->top));
}
--pOS->top;
}
else
{
pushNS(pNS, *(--pOS->top));
*(pOS->top++) = ch;
if ((*(pOS->top - 2) == '-' || *(pOS->top - 2) == '+') && (*(pOS->top - 1) == '+' || *(pOS->top - 1) == '-'))
//对-*+之类的情况变成-+的处理
{
pushNS(pNS, *(pOS->top - 2));
*(pOS->top - 2) = *(pOS->top - 1);
--pOS->top;
}
}
return;
}
void getsuffix (PSTACK pOS, PSTACK pNS, char ch)
{
if ('\n' == ch)
{
while (pOS->top != pOS->base)
{
pushNS(pNS, *(--pOS->top));
}
return;
}
if ('+' == ch || '-' == ch || '*' == ch || '/' == ch || '(' == ch || ')' == ch)
{
pushOS(pOS, pNS, ch);
}
else
{
pushNS(pNS, ch);
}
return;
}
void traverse (PSTACK pS)
{
for (int i = 0; i < (pS->top - pS->base); ++i)
{
printf("%c", *(pS->base + i));
}
return;
}
int main(void)
{
char ch;
STACK os;
STACK ns;
init(&os);
init(&ns);
printf("请输入表达式(回车代表输入完成):");
do
{
ch = getchar();
getsuffix(&os, &ns, ch);
}while ('\n' != ch);
printf("\n后缀式:");
traverse(&ns);
printf("\n");
return 0;
}