线性结构的常见应用之一 栈
定义:
一种可以实现“先进后出”的存储结构
分类:
静态栈(数组实现)、动态栈(链表实现);
算法:
- 进栈
- 出栈
应用:
- 函数调用(函数的地址和参数信息作为个体压入栈)
- 中断
- 生产者与消费者例子;生产者实现进栈、消费者实现出栈。
- 表达式求值(两个栈实现,一个为存数据的栈,一个为存预算符的栈)
- 走迷宫
代码——栈
#include <iostream>
#include <stdio.h>
#include <malloc.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//函数(包括主函数)静态、局部变量内存是在栈内分配的(操作系统来实现分配);动态内存分配是在堆内分配(malloc) ,动态内存分配需要程序员手动分配
typedef struct Node{
int data;
struct Node * pNext;
} NODE,* PNODE;
typedef struct Stack{
PNODE pTOP;
PNODE pBottom;
}STACK,* PSTACK;
//函数声明
void Init(PSTACK Sp); //生成有效栈,并且初始化
void Push(PSTACK Sp,int val); //入栈
void Traveres_stack(PSTACK Sp); //遍历栈
bool Pop(PSTACK Sp, int * p_dVal);//出栈
bool Clear_stack(PSTACK Sp);
bool Destroy(PSTACK Sp);
//主函数
int main(int argc, char** argv) {
STACK S; //STACK等价于struct Stack,备注此时并未S真正表示有效栈,需要初始化处理
Init(&S);
Push(&S,1);
Push(&S,2);
Push(&S,3);
Traveres_stack(&S);
Clear_stack(&S);
Traveres_stack(&S);
return 0;
}
//辅助函数
void Init(PSTACK Sp){
PNODE p=(PNODE)malloc(sizeof(NODE));
if(p == NULL){
printf("堆内存分配失败\n") ;
exit;
}
p->pNext=NULL;
Sp->pBottom = p;
Sp->pTOP = p;
}
void Push(PSTACK Sp,int val){
PNODE p = (PNODE)malloc(sizeof(NODE));
if(p == NULL){
printf("堆内存分配失败\n") ;
exit;
}
p->data= val;
p->pNext= Sp->pTOP;
Sp->pTOP = p;
}
void Traveres_stack(PSTACK Sp){
PNODE tp = Sp->pTOP;
printf("遍历栈:");
while(tp!=Sp->pBottom){
printf("%d,",tp->data);
tp=tp->pNext;
}
printf("\n");
}
bool Is_empty(PSTACK Sp){
if(Sp->pBottom == Sp->pTOP)
return true;
else
return false;
}
//把Sp栈出栈一次,并把出栈元素 保存在dVal中,如果出栈为空,返回false;
bool Pop(PSTACK Sp, int * p_dVal){
if(Is_empty(Sp)){
printf("栈为空!\n");
return false;
}else{
PNODE tmp=Sp->pTOP;
Sp->pTOP=Sp->pTOP->pNext;
*p_dVal=tmp->data;
free(tmp);
return true;
}
}
bool Clear_stack(PSTACK Sp){
PNODE tmp = NULL;
while(Sp->pTOP!=Sp->pBottom){
tmp=Sp->pTOP;
Sp->pTOP=Sp->pTOP->pNext;
free(tmp);
}
}
bool Destroy(PSTACK Sp){
Clear_stack(Sp);
free(Sp->pTOP);
Sp->pBottom=NULL;
Sp->pTOP=NULL;
return true;
}