八、栈
1.定义
一种可以实现”先进后出”的存储结构
栈类似于箱子
栈和堆是一种存储数据的方式
静态变量和局部变量是以压栈和出栈的方式来分配内存
而动态变量是以堆排序的方式来分配内存的
2.分类
静态栈
动态栈
3.算法
出栈
压栈
结构体定义
typedef struct Node
{
int data;
struct Node * pNext;
}NODE, * PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK, * PSTACK;
init方法
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;
}
}
push方法
void push(PSTACK pS, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
return;
}
push方法的示例图
首先pNew->pNext = pS->pTop;
pNext获得了pTop指针变量存放的地址,直接指向头结点
然后pS->pTop = pNew;用来存放pNew的地址
traverse方法
void traverse(PSTACK pS)
{
PNODE p = pS->pTop;
while (p != pS->pBottom)
{
printf(“%d “, p->data);
p = p->pNext;
}
printf(“n”);
return;
}
最终结果演示
empty方法
bool empty(PSTACK pS)
{
if (pS->pTop == pS->pBottom)
{
return true;
}
else
return false;
}
pop方法
//把pS所指向的栈出栈一次,并把出栈的元素存入pVal指向的变量中,如果出栈失败,则返回false
bool pop(PSTACK pS, int * pVal)
{
if (empty(pS))//pS本身存放的就是S的地址
{
return false;
}
PNODE p = pS->pTop;
*pVal = p->data;
pS->pTop = pS->pTop->pNext;
free(p);
p = NULL;
return true;
}
clear方法
void clear(PSTACK pS)
{
if (empty(pS))
{
return;
}
PNODE p = pS->pTop;
PNODE q = NULL;
while (p != pS->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
return;
}
4.应用
函数调用
将g的地址和g函数里面的变量压入栈中,然后出栈,到了g的地址是返回f
中断
表达式求值
内存分配
缓冲处理
走迷宫
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!