栈------空、满、入、出和长度

**本关任务是实现 step1/SeqStack.cpp 中的SS_IsFull、SS_IsEmpty、SS_Length、SS_Push和SS_Pop五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。

  1. List item

相关知识栈的基本概念栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶。栈既可以采用顺序存储,也可以采用链接存储来实现。下面给出了一种基于顺序存储的栈的实现方案: 如图 1 所示:该栈存储了 4 个元素 {56,77,15,12} ,其中 12 是栈顶元素。这种实现方案将栈元素存储在一片连续的空间中,栈相关的三个属性元素data、top和max介绍如下:
data: 给出栈存储空间的起始地址;
top: 存放栈顶元素的位置编号;
max: 指明栈存储空间中最多可存储的数据元素个数。
特别说明:空间的开始地址为data,连续空间里的位置编号从data所指的开始位置起,到该空间的结束位置,编号依次是0,1,2,…,max-1。
在图 1 的示例中max=6。栈顶元素的位置编号由top给出。栈结构的定义(C)基于data、top、max组织成的栈结构如下所示:structSeqStack
{Tdata;// 数据元素指针
inttop;// 栈顶元素编号
intmax;// 最大结点数};
为了讨论简单,我们假设栈元素的数据类型为整数: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);判断栈是否为满:

	#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)
{
/请在BEGIN和END之间实现你的代码/
/BEGIN/
if(ss->top==ss->max-1)
return true;
else
return false;
/END/
}

/判断栈是否为空/
bool SS_IsEmpty(SeqStack* ss)
{
/请在BEGIN和END之间实现你的代码/
/BEGIN/
if(ss->top==-1)
return true;
else
return false;
/END/
}

/获取栈元素个数/
int SS_Length(SeqStack* ss)
{
/请在BEGIN和END之间实现你的代码/
/BEGIN/
return ss->top+1;

/******END******/

}

/将x进栈,满栈则无法进栈(返回false)/
bool SS_Push(SeqStack* ss, T x)
{
/请在BEGIN和END之间实现你的代码/
/BEGIN/
if(ss->top==ss->max-1)
return false;
else
{
ss->data[ss->top+1]=x;
ss->top++;
}
/END/
}

/出栈,出栈的元素放入item,空栈则返回false/
bool SS_Pop(SeqStack* ss, T &item)
{
/请在BEGIN和END之间实现你的代码/
/BEGIN/
if(ss->top==-1)
return false;
else
{
item=ss->data[ss->top];
ss->top–;
}
/END/
}

/获取栈顶元素放入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");
}

猜你喜欢

转载自blog.csdn.net/weixin_52563520/article/details/120894455