#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define true 1
#define false 0
typedef int bool;
typedef struct Node
{
int val;
struct Node * next;
}NODE,*PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;
void init(PSTACK);
void push(PSTACK,int);
void traverse(PSTACK);
bool pop(PSTACK,int*);
bool isempty(PSTACK);
void clear(PSTACK);
//清空栈,将栈中节点的内存依次释放
void clear(PSTACK pStack)
{
if(isempty(pStack))
{
return;
}
else{
PNODE p = pStack->pTop;
while(p != pStack->pBottom)
{
PNODE q = p;
p = q->next;
free(q);
q = NULL;
}
pStack->pTop = p;
}
}
//判断栈是否为空
bool isempty(PSTACK pStack)
{
if(pStack->pBottom == pStack->pTop)
{
printf("栈已为空");
return true;
}
else{
return false;
}
}
//弹出栈
bool pop(PSTACK pStack,int * value)
{
if(isempty(pStack))
{
return false;
}
else
{
*value = pStack->pTop->val;
PNODE r = pStack->pTop;
pStack->pTop = pStack->pTop->next;
free(r);
r = NULL;
return true;
}
}
//初始化一个栈
void init(PSTACK pStack)
{
pStack->pBottom = (PNODE)malloc(sizeof(NODE));
if(NULL == pStack->pBottom)
{
printf("内存分配失败,程序即将退出");
exit(-1);
}else{
pStack->pTop = pStack->pBottom;
pStack->pBottom->next = NULL; // 此语句的作用是将栈底最后一个元素所指向的头的指针域设置为 NULL
}
}
//将某个元素压入栈中
void push(PSTACK pStack,int value)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->val = value;
pNew->next = pStack->pTop;
pStack->pTop = pNew;
}
//遍历栈中元素,并输出
void traverse(PSTACK pStack)
{
if(pStack->pBottom == pStack->pTop)
{
printf("栈已为空");
return;
}else
{
PNODE p = pStack->pTop;
while(p != pStack->pBottom)
{
printf("%d ",p->val);
p = p->next;
}
printf("\n");
}
}
int main()
{
STACK S;
init(&S);
push(&S,1);
push(&S,2);
push(&S,3);
push(&S,4);
traverse(&S);
// clear(&S);
traverse(&S);
int val;
while(pop(&S,&val))
{
printf("弹出的栈顶元素为 %d \n",val);
}
printf("栈已为空,无法出栈\n");
return 0;
}
数据结构之——栈的创建于基本操作
最新推荐文章于 2024-05-09 16:28:25 发布