线性结构的常见应用:栈
定义:一种可以实现“先进后出”的存储结构。
分类:静态栈,动态栈
算法:出栈,压栈
应用:函数调用,中断,表达式求值,内存分配,缓冲处理,迷宫
VS2017中 c语言实现动态栈的初始化,入栈,出栈,遍历输出,判断是否为空,清空
#include<stdio.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 is_empty(PSTACK);
bool pop(PSTACK, int *);
void clear(PSTACK);
int main() {
STACK S;//现有空间,内有pTop,pBottom指向一个垃圾值
int val;
init(&S);
push(&S,1);
push(&S, 2);
traverse(&S);
if (pop(&S, &val)) {
printf("出栈成功,出栈的元素是%d\n", val);
}
else
printf("出栈失败\n");
traverse(&S);
clear(&S);
traverse(&S);
system("pause");
return 0;
}
//让pTop,pBottom指向头结点完成初始化,头结点只是方便操作,并不一定是要在首结点的前面
void init(PSTACK ps){
ps->pTop = (PNODE)malloc(sizeof(NODE));
if (NULL == ps->pTop)
{
printf("动态内存分配失败\n");
exit(-1);
}
else
{
ps->pBottom = ps->pTop;
ps->pTop->pNext = NULL;//指针域清零
}
}
void push(PSTACK ps, int val) {
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = ps->pTop;
ps->pTop = pNew;
}
//FILO
void traverse(PSTACK ps){
PNODE p = ps->pTop;
while (p != ps->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
}
bool is_empty(PSTACK ps){
if (ps->pTop == ps->pBottom)
return true;
else
return false;
}
//可能pop失败故用bool类型,且要将出栈的元素存入pVal形参中,故用指针
bool pop(PSTACK ps, int * pVal){
if (is_empty(ps))
return false;
else {
PNODE r = ps->pTop;
ps->pTop = r->pNext;
* pVal = r->data;
free(r);
r = NULL;
return true;
}
}
//这里是让top往下移
void clear(PSTACK ps) {
if (is_empty(ps))
return;
else {
PNODE p = ps->pTop;
while (p != ps->pBottom) {
ps->pTop = p->pNext;
free(p);
p = ps->pTop;
}
}
}