数据结构C语言版-严蔚敏 笔记及源码(3)顺序栈的表示和实现

栈和线性表相似,栈也有两种存储表示方法。

  1. 顺序栈
  2. 链栈

栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。栈的修改时按后进先出的原则进行的。因此栈又称为后进先出线性表

顺序栈的操作有:
InitStack(&S) #栈的初始化
DestortStack(&S) #销毁栈
ClearStack(&S) #清空栈
StackEmpty(S) #判断栈是否为空
StackLength(S) #获取栈的长度
GetTop(S,&e) #获取栈的栈顶元素
Push(&S,e) #压栈
Pop(&S,&e) #出栈
StackTraverse(S,visit()) #以visis()规则遍历栈

直接上代码,代码可直接复制运行

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 
#define OVERFLOW -2

#define STACK_SIZE 100 // 栈初始向量大小 
#define STACKINCREMENT 10  //存储空间分配增量
typedef int ElemType;  
typedef int Status;  

//-------------------------------------------------------------------------------------
//栈的顺序表示 


//1.栈的类型定义 
typedef struct sqstack{
	ElemType *bottom;
	ElemType * top;
	int stacksize;
}SqStack; 
 
 //2.栈的初始化
 Status Init_Stack(SqStack &S){
 	S.bottom = (ElemType *)malloc(STACK_SIZE * sizeof(ElemType));
 	if(!S.bottom) exit (OVERFLOW);
 	S.top = S.bottom;
 	S.stacksize = STACK_SIZE;
 	return OK;
 }
 
 //3.GetTop
 Status GetTop(SqStack S,ElemType &e){
 	//若栈不空,则用e返回S的栈顶元素,并返回ok,否则error
	 if(S.top == S.bottom) return ERROR;
	 e = *(S.top - 1);
	 return OK; 
 }
 
 //4.压栈Push
 Status Push(SqStack &S,ElemType e){
 	if(S.top - S.bottom >= S.stacksize){
 		S.bottom = (ElemType *)realloc(S.bottom,(S.stacksize + STACKINCREMENT) * sizeof(ElemType));
 		if(!S.bottom) exit (OVERFLOW);
 		S.top = S.bottom + S.stacksize;
	 }
	 *S.top++ = e;
	 return OK;
 } 
 
 //5.出栈Pop
 Status Pop(SqStack &S,ElemType &e){
 	//若栈不空,删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
	 if(S.top == S.bottom) return ERROR;
	 e = * --S.top;
	 return OK; 
 } 
 
 //6.DestoryStack
 Status DestoryStack(SqStack &S){
 	free(S.bottom);
 	S.bottom = NULL;
 	S.top = NULL;
 	S.stacksize = 0;
 	
 	return OK;
 } 
 
 //7.ClearStack
 Status ClearStack(SqStack &S){
 	//清空栈 
	S.top = S.bottom;
 	
 	return OK;
 }
 
 //8.StackEmpty
 Status StackEmpty(SqStack S){
 	//判断栈是否为空
	if(S.bottom == S.top) 
		return TRUE;
	else 
		return FALSE;
 }
 
 //9.StackLength
 Status StackLength(SqStack S){
 	return S.top - S.bottom;
 }
 
 
 
 
int PrintElem(ElemType e){
 	printf("  %d  |\n",e);
 	printf("-----\n");
 }
 
 Status StackTraverse(SqStack S, Status(visit)(ElemType)){
 	//遍历栈的每个元素,并不破坏栈的结构
	 ElemType *p = S.top;
	 while(p > S.bottom) visit(*--p);
	 return OK;
 }
 
 main(){
 	int e,len;
 	printf("------------初始化栈-------------\n");
 	SqStack S;
 	Init_Stack(S);
 	
 	printf("------------判断是否为空-------------\n"); 
 	if(StackEmpty(S))
	 	printf("空\n");
	else
		printf("不为空\n"); 
		
 	printf("------------压栈-------------\n");
 	Push(S,1);
 	Push(S,2);
 	Push(S,3);
 	Push(S,4);
 	Push(S,5);
 	
 	printf("------------出栈-------------\n");
 	Pop(S,e);
 	printf("%d\n",e);
 	
	printf("------------遍历栈 + 获取长度-------------\n");
 	StackTraverse(S,PrintElem);
 	len = StackLength(S);
 	printf("栈的长度为: %d\n",len);
 	
 	printf("------------判断是否为空-------------\n"); 
 	if(StackEmpty(S))
	 	printf("空\n");
	else
		printf("不为空\n"); 
 	
 	printf("------------清空栈-------------\n"); 
 	ClearStack(S);
	len = StackLength(S);
 	printf("栈的长度为: %d\n",len);
 	
 }
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值