- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程说明:数据结构一共四天课程,day01~~~day04.
CSD DataStructure DAY01
基于顺序表的堆栈
基于链式表的堆栈
1 基于顺序表的堆栈
栈是一种特殊的线性表,是限定在线性表表尾进行插入删除操作的线性表。由栈的概念衍生出几个子概念,它们是:
1)栈顶,即允许进行插入、删除操作的一端,又称为表尾,用栈顶指针()来指示栈顶元素。
2)栈底,即固定端,又称为表头
3)空栈,即栈当中没有数据元素。
顺序栈是采用顺序存储结构的栈,即使用一组连续的存储单元(一般使用数组)来模拟栈,依次存放栈中的数据元素。
1.1 方案
顺序栈的基本操作包括:
1) 初始化操作,在初始化操作中将建立一个空栈。
2) 判断栈空,判断栈中的数据元素个数是否为0。
3) 入栈,在栈中加入一个数据元素。
4) 出栈,在栈中删除一个数据元素。
5) 取栈顶元素,将栈顶元素取出,但并不在栈中删除该元素。
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义栈
在C语言中:
1)定义一个一维数组来表示栈的顺序存储空间。
2)定义一个变量来指出栈顶的位置。
3)这两方面的信息共同描述一个栈,可将它们用结构体封装在一起。
代码如下:
#define LISTSIZE 10
typedef int DataType;
struct Stack {
DataType data[LISTSIZE];
int ; //除了记录大小 还可以记录栈顶位置
};
#define LISTSIZE 100
是用一个宏常量来定义顺序表的容量,这样定义的好处是当需要修改顺序表的容量的时候,只需要修改该宏常量即可。
上述代码中,以下代码:
typedef int DataType;
是将数据类型int起了一个别名叫做DataType,并在后面的程序中只使用DataType,而不使用int。这样做的好处是当堆栈中的数据类型发生变化时,只需要修改此句中的int为要改变的数据类型,即可将程序中所有数据变量的数据类型变成指定的类型。
步骤二:初始化操作
在主程序中,定义栈结构体的变量。
在初始化函数中将该变量中的栈顶指针初始化为0,表示为空栈。
代码如下:
void init(struct Stack *stack)
{
stack- = 0;
}
int main(int argc, const char * argv[])
{
struct Stack stack;
init(stack);
}
步骤三:判断栈空
判断栈空实际上是判断栈顶指针是否为0,因为当栈顶指针为0时,代表栈中没有数据元素。
代码如下:
bool empty(struct Stack* stack) {
return stack- == 0;
}
步骤四:入栈
入栈是在栈中加入一个数据元素,在入栈时,首先需要判断栈是否为满,如果栈满了,则就不能在向其中添加元素了,判断栈是否满的操作只有在顺序存储结构才会出现,因为采用顺序存储结构的栈是要事先定义栈的容量的。然后将数据元素放入栈中,并使栈顶指针加1,指向下一个位置。
代码如下:
void push(struct Stack* stack, DataType d) {
if (stack- == LISTSIZE)
return;
stack-data[stack-++] = d;
}
上述代码中,以下代码:
if (stack- == LISTSIZE)
是判断栈是否满,判断栈顶指针是否与栈的容量相等,如果是,则表示栈已经满了。
步骤五:出栈
出栈操作实际上是将栈中的栈顶元素删除,在出栈时,首先判断栈是否为空,如果栈为空则代表栈中已经没有数据元素了,此时是不可能进行出栈操作的。然后,将栈顶指针减1。
代码如下:
void pop(struct Stack* stack) {
if (empty(stack))
return;
stack---;
}
步骤六:取栈顶元素
取栈顶元素操作实际上是仅返回栈顶元素,而栈顶指针并不变动。在取栈顶元素时,首先也要判断栈是否为空,因为空栈同样是不可能有数据元素的。
代码如下:
DataType Data(struct Stack* stack) {
return stack-data[stack- - 1];
}
1.3 完整代码
本案例的完整代码如下所示:
#include stdio.h
#include stdbool.h
#define LISTSIZE 10
typedef int DataType;
struct Stack {
DataType data[LI
文档评论(0)