栈程序示例--C语言描述
链接: 郝斌数据结构.
栈的基本操作
包括
- 创建栈
- 压栈
- 出栈
- 清栈
- 遍历输出
- 判断是否为空
栈的操作和链表的操作类似
若不是很清楚可以看一下链表的笔记:链接: 链表基础知识.
栈顶和栈底相等为空,链式栈,不存在满不满的问题
#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;
void init(PSTACK); //初始化
void push(PSTACK, int); // 压栈
void traverse(PSTACK); // 遍历
bool pop(PSTACK, int*); // 出栈
bool empty(PSTACK); // 是否为空栈
void clear(PSTACK); // 清空栈
int main(void)
{
STACK S; //这行代码执行后,内存里面有了一个 S 变量,它包含pTop和pBottom,只是还未存放有效数据
int val; // 保存出栈的元素
init(&S); //初始化 造出一个空栈
push(&S, 1); // 压栈
push(&S, 2);
traverse(&S); // 遍历输出
if (pop(&S, &val))
{
printf("出栈的元素为: %d\n", val);
}
clear(&S);
if (empty(&S))
{
printf("clear");
}
traverse(&S);
return 0;
}
//初始化
void init(PSTACK pS)
{
pS->pTop = (PNODE)malloc(sizeof(NODE)); // ptop 存放了新开辟内存结点的地址
if (NULL == pS->pTop)
{
printf("动态内存分配失败");
exit(-1);
}
else // 创建一个空栈
{
pS->pBottom = pS->pTop; // pTop 和 pBottom 指向同一个结点
pS->pTop->pNext = NULL; // 等价于 pS->pBottom ->pNext = NULL; // 指针域设为空
}
}
//压栈:1. 造一个新结点,2. 数据域为val, 指针域指向头结点,3. ptop指针域指向 这个新结点
//见图 1
void push(PSTACK pS, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE)); // 产生一个新的结点
pNew->data = val; // 把 val 的值放到新结点的 数据域
pNew->pNext = pS->pTop; // 把 top 放到 新结点的 指针域
pS->pTop = pNew; // 把新的结点地址放到 top
return;
}
void traverse(PSTACK pS)
{
PNODE p = pS->pTop;
while (p != pS->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
// 判断栈是否为空
bool empty(PSTACK pS)
{
if (pS->pTop == pS->pBottom)
return true;
else
return false;
}
//把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true
bool pop(PSTACK pS, int* pVal)
{
if (empty(pS))
{
return false;
}
else
{
PNODE r = pS->pTop;
*pVal = r->data; // *pVal 表示变量本身,把 r 的数据域附给 pVal
pS->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
}
// 清空栈
void clear(PSTACK pS)
{
if (empty(pS))
{
return ;
}
else // 非空,则开始删除栈的元素
// 设置两个结点,让 q 永远指向 p 的下一个元素,见图2
{
PNODE p = pS->pTop;
PNODE q = NULL;
while (p != pS->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
}
此时的输出结果为
图1
图2