数据结构--顺序栈

3 栈的表示和操作的实现

3.3.1 栈的抽象数据类型的类型定义

  • InitStack(&S) 初始化操作

    • 操作结果:构造一个空栈S

  • DestoryStack(&S) :销毁栈操作

    • 初始条件:栈S已存在

    • 操作结果:栈S被销毁

  • StackEmpty(S) 判定S是否为空栈

    • 初始条件:栈S已存在

    • 操作结果:若栈S为空栈,则返回TRUE,否则FALSE

  • StackLength(S) 求栈的长度

    • 初始条件:栈S已存在

    • 操作结果:返回S的元素个数,即栈的长度

  • GetTop(S,&e) 取栈顶元素

    • 初始条件:栈S已存在且非空

    • 操作结果:用e返回S的栈顶元素

  • ClearStack(&S) 栈置空操作

    • 栈已存在

    • 将S清为空栈

  • Push(&S,e) 入栈操作

    • 初始条件:栈S已存在

    • 操作结果:插入元素e为新的栈顶元素

  • Pop(&S,&e) 出栈操作

    • 初始条件:栈S已经存在且,并用e返回其值

3.3.2 顺序栈的表示和实现

存储方式:同一般的线性表的顺序存储结构完全相同,利用一组地址连续的存储单元

依次存放自栈底到栈顶的数据元素。栈底一般在低地址端。

  • 附设top指针,指示栈顶元素在顺序栈中的位置。

    • 但是,为了方便操作,通常top指示真正的栈顶元素之上的下标地址。

  • 另设base指针,指示栈底元素在顺序栈中的位置。

  • 另外用stacksize表示栈可使用的最大容量。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWFVOfk1MRg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

使用数组作为顺序栈存储方式的特点:

简单,方便,但易产生溢出(数组大小固定)

  • 上溢(overflow):栈已经满,又要压入元素

  • 下溢(underflow):栈已经空,还要弹出元素

:

上溢是一种错误,使问题的处理无法进行;而下溢一般认为是一种结束条件,即问题处理结束。

 

 

顺序栈的实现:

1、栈的初始化

Status InitStack(SqStack &S){
	S.base = new SElemType[MAXSIZE];
	if(!S.base){
		return OVERFLOW; 
	}
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}

2、判断栈是否为空

// 2、判断栈是否为空
int StackEmpty(SqStack S){
	if(S.top == S.base){
		return TRUE;
	}else{
		return FALSE;
	}
}

3、求栈的长度

// 3、求栈的长度
int StackLength(SqStack S){
	return S.top - S.base;
} 

4、清空栈

Status StackClear(SqStack &S){
	if(S.base){      				// 如果栈存在 
		S.top = S.base;
	}
	return OK;
} 

5、销毁栈

Status StackDestory(SqStack &S){
	if(S.base){
		delete S.base;
		S.stacksize = 0;
		S.base = S.top = NULL;
	}
	return OK;
} 

6、压栈

// 6、压栈
Status Push(SqStack &S,SElemType e){
	if(S.top-S.base == S.stacksize){		// 栈满,无法压栈 
		return ERROR; 
	}
	*S.top=e;
	*S.top++; 	 // *S.top++ = e
	return OK;
}

7、弹栈

// 7、弹栈
Status Pop(SqStack &S,SElemType e){
	if(S.top == S.base){			// 栈空,无法删除 
		return ERROR;
	}
	--S.top;
	e = *S.top;  // e = --*S.top;
	return OK; 
} 

 

代码汇总及测试

# include<stdio.h>

# define OK 1
# define ERROR 0
# define OVERFLOW -2
# define MAXSIZE 100
# define TRUE 1
# define FALSE 0


typedef int Status;
typedef int SElemType; 

typedef struct{
	SElemType *base;			// 栈底指针 
	SElemType *top;				// 栈顶指针 
	int stacksize; 				// 栈可用最大容量 
}SqStack;

// 1、顺序栈的初始化
Status InitStack(SqStack &S){
	S.base = new SElemType[MAXSIZE];
	if(!S.base){
		return OVERFLOW; 
	}
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
} 

// 2、判断栈是否为空
int StackEmpty(SqStack S){
	if(S.top == S.base){
		return TRUE;
	}else{
		return FALSE;
	}
}

// 3、求栈的长度
int StackLength(SqStack S){
	return S.top - S.base;
} 

// 4、清空栈
Status StackClear(SqStack &S){
	if(S.base){      				// 如果栈存在 
		S.top = S.base;
	}
	return OK;
} 

// 5、销毁栈
Status StackDestory(SqStack &S){
	if(S.base){
		delete S.base;
		S.stacksize = 0;
		S.base = S.top = NULL;
	}
	return OK;
} 
 
// 6、压栈
Status Push(SqStack &S,SElemType e){
	if(S.top-S.base == S.stacksize){		// 栈满,无法压栈 
		return ERROR; 
	}
	*S.top=e;
	*S.top++; 	 // *S.top++ = e
	return OK;
} 

// 7、弹栈
Status Pop(SqStack &S,SElemType e){
	if(S.top == S.base){			// 栈空,无法删除 
		return ERROR;
	}
	--S.top;
	e = *S.top;  // e = --*S.top;
	return OK; 
} 
 
int main(){
	// 1、初始化
	SqStack S;
	InitStack(S);
	
	// 2、判断是否为空 
	int re = StackEmpty(S);
	printf("栈是否为空:%d\n",re);
	
	// 3、压栈
	Push(S,1);
	Push(S,2);
	
	// 4、栈的长度
	int leng = StackLength(S);
	printf("栈的长度:%d\n",leng);
	
	// 5、弹栈
	Pop(S,1); 
	 
	// 4、栈的长度
	int leng2 = StackLength(S);
	printf("栈的长度:%d\n",leng2);
	
	// 2、判断是否为空 
	int re2 = StackEmpty(S);
	printf("栈是否为空:%d\n",re2);
	 
	
	return 0;
} 

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XUN~MLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值