#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct node //定义节点类型
{
int data;
struct node* pNext;
}*PNODE, NODE;
typedef struct stack //定义栈类型
{
PNODE pTop;
PNODE pBottom;
}*PSTACK, STACK;
//操作函数原型
bool init(PSTACK pStack);
void push(PSTACK pStack, int val);
bool pop(PSTACK pStack, int* val);
void show(PSTACK pStack);
bool is_empty(PSTACK pStack);
//测试程序
main() {
int val;
STACK Stack;
init(&Stack);
push(&Stack, 1);
push(&Stack, 2);
push(&Stack, 3);
push(&Stack, -11);
show(&Stack);
pop(&Stack, &val);
printf("\npop %d ", val);
pop(&Stack, &val);
printf("\npop %d ", val);
pop(&Stack, &val);
printf("\npop %d ", val);
printf("\n");
show(&Stack);
printf("\n");
}
//操作函数
bool init(PSTACK pStack) {
bool is_init = true;
pStack->pBottom = (PNODE)malloc(sizeof(NODE));
if (NULL == pStack->pTop) {
is_init = false;
//printf("Init stack error!!");
exit(-1);
}
else {
pStack->pBottom->pNext = NULL; //这句必须在上面!!
pStack->pTop = pStack->pBottom;
}
return is_init;
}
void push(PSTACK pStack, int val) {
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = pStack->pTop;
pStack->pTop = pNew;
}
bool is_empty(PSTACK pStack) {
if (pStack->pBottom == pStack->pTop)
return true;
else
return false;
}
bool pop(PSTACK pStack, int* val) {
bool is_pop = true;
if (is_empty(pStack)) {
is_pop = false;
}
else {
PNODE q = pStack->pTop; //防止出现内存泄漏
*val = q->data;
pStack->pTop = pStack->pTop->pNext; //栈顶下移
free(q); //回收q指向的内存,即pop的node
q = NULL; //清空q指针
}
return is_pop;
}
void show(PSTACK pStack) {
int len = 0;
PNODE p = pStack->pTop;
printf("Stack : ");
while (NULL != p->pNext) // while ( pStack->pBottom!= p )
{
printf("%d ", p->data);
p = p->pNext;
len++;
}
printf(" \nStack Lenth = %d ", len);
}