链栈实现中缀转后缀
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef char DataType;
typedef struct data {
DataType data;
}Item;
typedef struct node {
Item item;
struct node* next;
}Node;
typedef struct {
Node* top;
Node* bottom;
int node_num;
}Stack;
bool InitStack(Stack* pstack);
bool StackIsEmpty(Stack* pstack);
bool StackIsFull(Stack* pstack);
bool PushStack(Stack* pstack, DataType data);
bool PopStack(Stack* pstack);
DataType GetTop(Stack* pstack);
bool PrintStack(Stack* pstack);
bool FreeStack(Stack* pstack);
bool ComOper(Stack* pstack, char ch);
void FunLz(Stack* ptemp, Stack* poper);
bool InitStack(Stack* pstack)
{
pstack->node_num = 0;
pstack->top = (Node*)malloc(sizeof(Node));
pstack->bottom = NULL;
pstack->top->next = pstack->bottom;
if (pstack->bottom != NULL)
return false;
if (pstack->top->next != pstack->bottom)
return false;
return true;
}
bool StackIsEmpty(Stack* pstack)
{
bool empty = true;
if (pstack->node_num == 0)
return empty;
else return !empty;
}
bool StackIsFull(Stack* pstack)
{
bool full = true;
Node* ptemp;
ptemp = (Node*)malloc(sizeof(Node));
if (ptemp == NULL)
{
free(ptemp);
return full;
}
else
{
free(ptemp);
return !full;
}
}
bool PushStack(Stack* pstack, DataType data)
{
Node* pnew;
pnew = (Node*)malloc(sizeof(Node));
if (pnew == NULL)
return false;
pnew->item.data = data;
if (StackIsEmpty(pstack) == true)
{
pnew->next = pstack->bottom;
pstack->top = pnew;
pstack->node_num++;
return true;
}
if (StackIsEmpty(pstack) == false)
{
pnew->next = pstack->top;
pstack->top = pnew;
pstack->node_num++;
return true;
}
return false;
}
bool PopStack(Stack* pstack)
{
Node* ptemp;
if (StackIsEmpty(pstack) == true)
{
printf("栈空!无法出栈!\n");
return false;
}
else
{
ptemp = pstack->top;
pstack->top = pstack->top->next;
free(ptemp);
pstack->node_num--;
return true;
}
}
DataType GetTop(Stack* pstack)
{
if (StackIsEmpty(pstack) == true)
{
printf("栈空!无法获取栈顶元素!\n");
return false;
}
else
return pstack->top->item.data;
}
bool PrintStack(Stack* pstack)
{
Node* pscan = pstack->top;
if (StackIsEmpty(pstack) == true)
{
printf("栈空!无法打印栈元素!\n");
return false;
}
else
{
printf("全体栈元素:");
while (pscan != NULL)
{
printf("%c", pscan->item.data);
pscan = pscan->next;
}
putchar('\n');
return true;
}
}
bool FreeStack(Stack* pstack)
{
Node* ptemp = pstack->top;
if (StackIsEmpty(pstack) == true)
{
printf("栈空!无需释放!\n");
return false;
}
else
{
while (ptemp != NULL)
{
pstack->top = pstack->top->next;
free(ptemp);
ptemp = pstack->top;
}
return true;
}
}
bool ComOper(Stack* pstack, char ch)
{
bool greater = true;
bool equal = false;
bool less = false;
if (ch == '*' || ch == '/')
{
if (GetTop(pstack) == '*' || GetTop(pstack) == '/')
return equal;
else
return greater;
}
else if (ch == '+' || ch == '-')
return less;
else
return false;
}
void FunLz(Stack* ptemp, Stack* poper)
{
char ch, temp;
int n;
do {
scanf_s("%c", &ch, (int)sizeof(char));
if(ch != '#')
printf("输入%c\n", ch);
if (ch == '#')break;
else if (ch >= '0' && ch <= '9')
{
PushStack(ptemp, ch);
printf("%c进临时结果栈\n", ch);
}
else
{
if (StackIsEmpty(poper) == true || ch == '(')
{
PushStack(poper, ch);
printf("%c进运算符栈\n", ch);
}
else if (ch == ')')
{
while (GetTop(poper) != '(')
{
temp = GetTop(poper);
PopStack(poper);
printf("%c出运算符栈\n", temp);
PushStack(ptemp, temp);
printf("%c进临时结果栈\n", temp);
}
PopStack(poper);
printf("(出运算符栈\n");
}
else if (GetTop(poper) == '(')
{
PushStack(poper, ch);
printf("%c进运算符栈\n", ch);
}
else
{
if (ComOper(poper, ch) == true)
{
PushStack(poper, ch);
printf("%c进运算符栈\n",ch);
}
else
{
temp = GetTop(poper);
PopStack(poper);
printf("%c出运算符栈\n", temp);
PushStack(ptemp, temp);
printf("%c进临时结果栈\n", temp);
PushStack(poper, ch);
printf("%c进运算符栈\n", ch);
}
}
}
if (StackIsEmpty(ptemp) == false)
{
printf("临时结果");
PrintStack(ptemp);
}
if (StackIsEmpty(poper) == false)
{
printf("运算符");
PrintStack(poper);
}
putchar('\n');
} while(ch != '#');
while (getchar() != '\n')
continue;
n = poper->node_num;
while (n--)
{
temp = GetTop(poper);
PopStack(poper);
printf("%c出运算符栈\n", temp);
PushStack(ptemp, temp);
printf("%c进临时结果栈\n", temp);
if (StackIsEmpty(ptemp) == false)
{
printf("临时结果");
PrintStack(ptemp);
}
if (StackIsEmpty(poper) == false)
{
printf("运算符");
PrintStack(poper);
}
}
putchar('\n');
}
int main()
{
Stack S1;
Stack S2;
if (InitStack(&S1) && InitStack(&S2))
printf("程序运行……\n");
else
exit(1);
if (StackIsFull(&S1) == false && StackIsFull(&S2) == false)
FunLz(&S1, &S2);
else
exit(1);
if (StackIsEmpty(&S1) == false)
PrintStack(&S1);
if(StackIsEmpty(&S2) == false)
PrintStack(&S2);
FreeStack(&S1);
return 0;
}