/*
栈:
1、什么叫栈:栈就是一个存储结构,简单的说就是一种存储的方式
2、栈是怎么存储的:栈是先进后出的一种存储结构,类似于箱子
3、栈的分类:静态栈、动态栈。
4、什么叫静态栈:类似于数组往箱子里放
5、什么叫动态栈:类似于链表往箱子里放
6、栈的应用有哪些:迷宫,表达式的计算,函数的调用,中断等,应用相当的广泛
7、栈的操作步骤:初始化,压栈,出栈
注:栈是静态内存存储,比如说,定义的变量,这是系统自动分配的。堆是动态存储结构,是程序员分配的
比如说malloc(sizeof(4))
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node * pNext;
}Node,*pNode;
typedef struct stack
{
pNode pTop;
pNode pBottom;
}Stack,* pStack;
typedef int bool;
#define true 0
#define false 1
void init_stack(pStack);
bool is_empty(pStack);
bool push_stack(pStack, int);
bool pop_stack(pStack, int *);
bool clear_stack(pStack);
int main(void)
{
Stack S;
int val;
init_stack(&S);
puts("------------------------------初始化栈是否为空-------------------------------");
if( is_empty(&S) )
printf("栈不为空!\n");
else
printf("栈为空!\n");
push_stack(&S, 23);
push_stack(&S, 45);
push_stack(&S, 19);
puts("-------------------------------压栈之后是否为空------------------------------");
if( is_empty(&S) )
printf("栈不为空!\n");
else
printf("栈为空!\n");
puts("-------------------------------压栈是否成功----------------------------------");
if( push_stack(&S, 55) )
printf("压栈失败!\n");
else
printf("压栈成功!\n");
if( !pop_stack(&S, &val) )
printf("出栈成功:");
pop_stack(&S,&val);
puts("---------------------------------把栈清空-----------------------------------");
if( !clear_stack(&S) )
puts("清栈成功!");
pop_stack(&S,&val);
return 0;
}
void init_stack(pStack pS)
{
pNode pNew=(pNode)malloc(sizeof(Node));
if(pNew==NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
pS->pTop=pNew;
pS->pBottom=pS->pTop;
pS->pBottom->pNext=NULL; //等价于 pNew->pNext=NULL
return;
}
bool is_empty(pStack pS)
{
if(pS->pTop==pS->pBottom)
return true;
else
return false;
}
bool push_stack(pStack pS, int val)
{
pNode pNew=(pNode)malloc(sizeof(Node));
if(pNew==NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
pNew->data=val;
pNew->pNext=pS->pTop;
pS->pTop=pNew;
if(pS->pTop==pS->pBottom)
return false;
else
return true;
}
bool pop_stack(pStack pS, int * pVal)
{
pNode p=NULL;
while( is_empty(pS) )
{
p=pS->pTop;
*pVal=p->data;
printf("%d\t",*pVal);
pS->pTop=p->pNext;
free(p);
}
putchar('\n');
if( is_empty(pS) )
return false;
else
return true;
}
bool clear_stack(pStack pS)
{
while( pS->pTop != pS->pBottom )
{
pNode p=pS->pTop;
pNode q=p->pNext;
free(p);
pS->pTop=q;
}
if(pS->pTop==pS->pBottom)
return true;
else
return false;
}