栈的顺序存储——分析与实现

本文实现目标:

实现 step1/SeqStack.cpp 中的SS_IsFullSS_IsEmptySS_LengthSS_PushSS_Pop五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。

栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶。栈既可以采用顺序存储,也可以采用链接存储来实现。下面给出了一种基于顺序存储的栈的实现方案:

如图 1 所示:该栈存储了 4 个元素 {56,77,15,12} ,其中 12 是栈顶元素。

这种实现方案将栈元素存储在一片连续的空间中,栈相关的三个属性元素datatopmax介绍如下:

  • data: 给出栈存储空间的起始地址;
  • top: 存放栈顶元素的位置编号;
  • max: 指明栈存储空间中最多可存储的数据元素个数。

栈结构的定义(C)

基于datatopmax组织成的栈结构如下所示:

  1. struct SeqStack{
  2. T* data; // 数据元素指针
  3. int top; // 栈顶元素编号
  4. int max; // 最大结点数
  5. };

为了讨论简单,我们假设栈元素的数据类型为整数:

typedef int T; // 栈元素的数据类型

据此,只要给定指向该结构的一指针 ss ,就可对栈进行进栈出栈操作。

  • 进行进栈操作时,新进栈的元素保存在 top+1 位置,进栈后 top 加 1 ,这时的状态则如图 2 所示。

  • 进行出栈操作时,将位置编号为 top 的元素出栈,出栈后 top 减去 1 ,这时的状态则如图 3 所示。

顺序栈的操作

以顺序存储的栈为例,我们定义如下操作:

  • 创建栈:创建一个最多可以存储 maxlen 个元素的顺序栈。具体操作函数定义如下: SeqStack* SS_Create(int maxlen)

  • 释放栈空间:释放栈所占用的空间。具体操作函数定义如下: void SS_Free(SeqStack* ss)

  • 清空一个栈:将栈中元素清空。具体操作函数定义如下: void SS_MakeEmpty(SeqStack* ss)

  • 判断栈是否为满:若栈为满,则返回 true,否则返回false。具体操作函数定义如下: bool SS_IsFull(SeqStack* ss)

  • 判断栈是否为空:若栈为空,则返回true,否则返回false。具体操作函数定义如下: bool SS_IsEmpty(SeqStack* ss)

  • 求栈元素个数:获取栈元素个数。具体操作函数定义如下: int SS_Length(SeqStack* ss)

  • 将元素 x 进栈:将 x 进栈,若满栈则无法进栈,返回false,否则返回true。具体操作函数定义如下: bool SS_Push(SeqStack* ss, T x)

  • 出栈:出栈的元素放入 item 。若出栈成功(栈不为空),则返回true;否则(空栈),返回false。具体操作函数定义如下: bool SS_Pop(SeqStack* ss, T &item)

  • 获取栈顶元素:获取栈顶元素放入 item 中。若获取失败(空栈),则返回false,否则返回true。具体操作函数定义如下: bool SS_Top(SeqStack* ss, T & item)

  • 打印栈中元素:从栈底到栈顶打印出所有元素。具体操作函数定义如下: void SS_Print(SeqStack* ss)

相信大家对于栈已经有了很深的理解,下面给出C/C++语言实现的代码(仅供参考):

#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"

/*创建一个栈*/
SeqStack* SS_Create(int maxlen)
{
	SeqStack* ss=(SeqStack*)malloc(sizeof(SeqStack));
	ss->data=(T*)malloc(maxlen*sizeof(T));
	ss->top=-1;
	ss->max=maxlen;
	return ss;
}

/*释放一个栈*/
void SS_Free(SeqStack* ss)
{
	free(ss->data);
	free(ss);
}

/*清空一个栈*/
void SS_MakeEmpty(SeqStack* ss)
{
	ss->top=-1;
}

/*判断栈是否为满*/
bool SS_IsFull(SeqStack* ss)
{
if (ss->top==ss->max-1)
return true;
else
return false;
 
}

/*判断栈是否为空*/
bool SS_IsEmpty(SeqStack* ss)
{
if (ss->top==-1)
return true;
else
 return false;
}

/*获取栈元素个数*/
int SS_Length(SeqStack* ss)
{
return ss->top+1;
}

/*将x进栈,满栈则无法进栈(返回false)*/
bool SS_Push(SeqStack* ss, T x)
{
	
if (ss->top==ss->max-1)
return false;
	else 
	{
		ss->top++;
		ss->data[ss->top] = x;
		return true;
	}

}

/*出栈,出栈的元素放入item,空栈则返回false*/
bool SS_Pop(SeqStack* ss, T &item)
{
if (ss->top==-1)
return false;
else
{
	item = ss->data[ss->top];
		ss->data[ss->top] = NULL;
		ss->top--;
		return true;
}
   
}

/*获取栈顶元素放入item中,空栈则返回false*/
bool SS_Top(SeqStack* ss, T & item)
{
	if (SS_IsEmpty(ss)) {
		return false;
	}
	item = ss->data[ss->top];
	return true;
}

/*从栈底到栈顶打印出所有元素*/
void SS_Print(SeqStack* ss)
{
	if (SS_IsEmpty(ss)) {
		printf("stack data: Empty!\n");
		return;
	}
	printf("stack data (from bottom to top):");
	int curr=0;
	while(curr<=ss->top) {
		printf(" %d", ss->data[curr]);
		curr++;
	}
	//printf("\n");
}

通过以上代码,我们可以实现对于顺序存储的栈的一系列基本操作,并可以以此为基础去解决一些相关的实际问题。

欢迎大家留言评论指出一些地方的改进方法!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

少年与白日梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值