定义:一种可以“先进后出”的存储结构
分类:静态栈,动态栈
算法:压栈,出栈
应用:函数调用,中断,表达式求值,内存分配,缓冲处理,迷宫
代码实现
与链表实现类似,依旧需要先创建结点
typedef struct Node{//先创建结点
int data;//结点数据域
struct Node *next;//结点指针域
}NODE, *PNODE;
//其中NODE等价struct Node
//PNODE 等价 struct Node *
typedef struct Stack{//创建栈
PNODE pTop;//栈顶
PNODE pBottom;//栈底
}STACK, *PSTACK;
//其中STACK等价struct Stack
//PSTACK 等价 struct Stack *
初始化栈
void init_stack(PSTACK pS){
pS->pTop = (PNODE)malloc(sizeof(NODE));//给栈顶分配内存
if(NULL == pS->pTop){
printf("分配内存失败,程序中止!\n");
exit(-1);
}
else{
pS->pBottom = pS->pTop;//空栈,栈顶栈底指向同一个结点
pS->pTop->next = NULL;//指向的结点指针域与NULL
}
return ;
}
压栈
void push_stack(PSTACK pS,int val){
PNODE pNew = (PNODE)malloc(sizeof(NODE));//建立一个新的结点
if(NULL == pNew){
printf("内存分配失败,程序中止\n");
exit(-1);
}
else{
pNew->data = val;//存入结点数据
pNew->next = pTop;//将新的结点指向Top所指的结点
pTop->next = pNew;//将top指向新的结点
return ;
}
}
遍历栈
void traverse_stack(PSTACK pS){
PNODE p = pS->pTop;
while(p != pS->Bottom){
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
return ;
}
判断栈是否为空
void is_empty(PSTACK pS){
if(pS->pTop == pS->pBottom){
return true;
}
else{
return false;
}
}
出栈
bool pop_stack(PSTACK pS,int *Pval){
if(is_empty(pS)){
return false;
}
else{
PNODE p = pS->pTop;//新的结点保存栈顶
pS->pTop = p->next;//栈顶指向下一个结点
*Pval = p->data;//数据域赋值
free(p);
p = NULL;
return ture;
}
}
清空栈
void clear(PSTACK pS){
if(is_empty(pS)){
return ;
}
else{
PNODE p = pS->pTop;
PNODE q = NULL;
while(p != pS->pBottom){
q = p->next;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
}
return ;
}