// 2013-11-5
//链表静态栈
/*
*在一个栈结构体中设置两个节点指针,分别指向栈顶和栈底
*节点是按需要新增的,所以这个栈理论上是可以很大的,与windows系统自动分配的栈有所不同
*首先要初始化栈,就是将栈顶和栈底都指向一个新造的节点,这个节点始终都存在,相当于链表中的头结点,
*这个节点不放任何数据元素,只是用来管理栈的
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
typedef struct node
{
int data;
struct node * pNext;
}NODE, *PNODE;
typedef struct stack
{
PNODE top;
PNODE bottom;
}STACK, *PSTACK;
void init(PSTACK pS);
void push(PSTACK pS, int);
bool pop(PSTACK pS, int *);
bool isempty(PSTACK pS);
void clear(PSTACK pS);
void traverse(PSTACK pS);
int main(void)
{
int val;
STACK s;
init(&s);
push(&s, 8);
push(&s, 4);
traverse(&s);
if (pop(&s, &val))
{
printf("弹出成功,弹出的元素为:%d\n", val);
}
traverse(&s);
clear(&s);
traverse(&s);
return 0;
}
void init(PSTACK pS)
{
pS->top = (PNODE)malloc(sizeof(NODE));
if ( NULL == pS->top)
{
printf("内存分配失败!!\n");
exit(-1);
}
else
{
pS->bottom = pS->top;
pS->top->pNext = NULL;
}
}
void push(PSTACK pS, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("分配内存失败!!\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = pS->top;
pS->top = pNew;
}
bool pop(PSTACK pS, int *pVal)
{
if (isempty(pS))
{
printf("栈已经为空了!!\n");
return false;
}
else
{
PNODE p = pS->top;
*pVal = p->data;
pS->top = p->pNext;
free(p);
p = NULL;
return true;
}
};
void traverse(PSTACK pS)
{
if (isempty(pS))
{
printf("空栈,没有元素!!不能输出~~~~~~~~~~\n");
return;
}
else
{
PNODE p = pS->top;
while (p != pS->bottom)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
return;
}
}
bool isempty(PSTACK pS)
{
if (pS->top == pS->bottom)
{
return true;
}
else return false;
}
void clear(PSTACK pS)
{
PNODE p = pS->top;
while (p != pS->bottom)
{
PNODE q = p->pNext;
free(p);
p = q;
}
pS->top = p;
}
结果显示为:链表栈(动态分配管理)
最新推荐文章于 2026-05-23 10:41:53 发布
&spm=1001.2101.3001.5002&articleId=14447233&d=1&t=3&u=8b008b704dc04faa813fe7c87833d43b)
2708

被折叠的 条评论
为什么被折叠?



