数据结构之栈篇

线性结构的常见应用之一 栈

定义:

一种可以实现“先进后出”的存储结构

分类:

静态栈(数组实现)、动态栈(链表实现);

算法:
  1. 进栈
  2. 出栈
应用:
  1. 函数调用(函数的地址和参数信息作为个体压入栈)
  2. 中断
  3. 生产者与消费者例子;生产者实现进栈、消费者实现出栈。
  4. 表达式求值(两个栈实现,一个为存数据的栈,一个为存预算符的栈)
  5. 走迷宫

代码——栈

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值