#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef enum BOOL
{
false = 0,
true = 1
}bool;
typedef struct Node
{
int data; //数据域
struct Node* pNext;//指针域
}NODE,*PNODE;
typedef struct Stack
{
PNODE pTop; //栈顶
PNODE pBottom; //栈底
}STACK,*PSTACK;
//函数声明
void initStack(PSTACK); //初始化
void push(PSTACK,int); //存放数据
void traverse(PSTACK); //遍历
bool pop(PSTACK,int *); //pop数据
bool empty(PSTACK ps);
bool clear(PSTACK); //清空
int main()
{
int val; //保存出栈的元素
STACK ista; //STACK == struct Stack
initStack(&ista); //初始化,造出一个空栈
push(&ista,1); //push数据,往栈里面压入数据
push(&ista,2);
push(&ista,3);
push(&ista,4);
push(&ista,5);
push(&ista,6);
traverse(&ista); //遍历
if(pop(&ista,&val))
{
printf("出栈成功,出栈的元素是 %d\n",val);
}
else
{
printf("出栈失败!\n");
}
if(clear(&ista))
{
printf("清空成功!\n");
}
else
{
printf("清空失败!\n");
}
traverse(&ista); //遍历数据
return 0;
}
bool clear(PSTACK ps) //清空
{
if(empty(ps))
return false;
else
{
PNODE p = ps->pBottom;
PNODE q = NULL;
while(p != ps->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
ps->pTop = ps->pBottom;
return true;
}
}
bool empty(PSTACK ps)
{
if(ps->pTop == ps->pBottom)
return true;
else
return false;
}
//把ps所指向的栈出栈一次,并把出栈的元素存入pval形参所指的变量中
//如果为空返回false,不空则出栈
bool pop(PSTACK ps,int *pval) //pop数据
{
if(empty(ps))
{
return false;
}
else
{
PNODE r = ps->pTop;
*pval = r->data;
ps->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
}
void traverse(PSTACK ps) //遍历
{
PNODE p = ps->pTop;
while(p != ps->pBottom)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
void initStack(PSTACK pSt) //初始化
{
pSt->pTop = (PNODE)malloc(sizeof(NODE));
if(pSt->pTop == NULL)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
pSt->pBottom = pSt->pTop;
pSt->pTop->pNext = NULL;
}
}
void push(PSTACK ps ,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = ps->pTop;//不能写成ps->Bottom
ps->pTop = pNew;
}
栈和队列操作
最新推荐文章于 2022-01-30 19:35:38 发布