堆栈有几种实现方式图解,堆栈有几种实现方式图
如何解决写爬虫IP受阻的问题?立即使用。
堆栈有3种实现方式,实现方式为:
一、静态数组堆栈
在静态数组堆栈中,STACK_SIZE表示堆栈中可以存储的元素的最大值,top_element用作数组下标来表示堆栈中的元素。当top_element==-1时,堆栈为空。当top_element==STACK_SIZE-1时,堆栈已满。push时,top_element加1,top_element==0时,表示第一个栈元素;在pop时,top_element减少1。
A_stack.c源代码如下:
[cpp]查看普通文本
/*
**
* *静态数组实现堆栈程序a_stack.c,数组长度由#define决定。
*/
#includestack.h
#includeassert.h
# includestdio.h
#define STACK_SIZE 100 /*堆栈中元素的最大数量*/
/*
* *在堆栈中存储一个数组和指向堆栈顶部元素的指针
*/
静态STACK_TYPE堆栈[STACK _ SIZE];
static int top _ element=-1;
/*推送*/
void push(STACK_TYPE值)
{
断言(!is _ full());/*在将堆栈推入堆栈之前,确定堆栈是否已满*/
top _ element=1;
stack[top_element]=值;
}
/*流行*/
无效弹出(无效)
{
断言(!is _ empty());/*在弹出堆栈之前确定它是否为空*/
top _ element-=1;
}
/*顶部*/
堆栈类型顶部(空)
{
断言(!is _ empty());
返回堆栈[top _ element];
}
/* is_empty */
int是_empty(void)
{
返回top _ element==-1;
}
/*是_满*/
int is_full(void)
{
return top _ element==STACK _ SIZE-1;
}
/*
* *定义一个打印函数来打印堆栈中的元素。
*/
作废打印(作废)
{
int I;
i=top _ element
Printf(打印出静态数组堆栈中的值:);
如果(i==-1)
Printf(这是一个空堆栈\ n );
而(我!=-1)
printf(%d ,stack[I-]);
printf( \ n );
}
int main(void)
{
print();
推(10);推(9);推(7);推(6);推(5);
推(4);推(3);推(2);推(1);推送(0);
Printf(推入值后:\ n );
print();
printf( \ n );
pop();
pop();
printf( pop弹出几个元素后堆栈元素:\ n );
print();
printf( \ n );
printf( top():% d \ n ,top())调用的top值;
返回1;
}结果如下:
二、动态数组堆栈
头文件还是用stack.h,变化不大。添加stack_size变量而不是STACK_SIZE来节省堆栈的长度。数组用指针代替,全局变量下默认值为0。
create_stack函数首先检查堆栈是否已经创建,然后分配所需的内存量,并检查分配是否成功。destroy_stack函数首先检查堆栈是否存在,并在内存被释放后将长度和指针变量重置为零。向is_empty和is_full函数添加一个断言,以防止在创建堆栈之前调用任何堆栈函数。
D_stack.c源代码如下:
[cpp]查看普通文本
/*
* *通过动态分配数组实现的堆栈程序d_stack.c
* *堆栈的长度是在调用创建堆栈的函数时给出的。这个函数必须在调用任何其他操作堆栈的函数之前使用。
*/
#includestack.h
# includestdio.h
# includemalloc.h
#includeassert.h
/*
* *用于存储堆栈元素和指向堆栈顶部元素的指针的数组
*/
静态STACK _ TYPE * stack
静态int stack _ size
static int top _ element=-1;
/*创建堆栈*/
void create_stack(size_t size)
{
assert(stack _ size==0);
stack _ size=size
STACK=(STACK _ TYPE *)malloc(STACK _ size * sizeof(STACK _ TYPE));
if(stack==NULL)
perror(“malloc分配失败”);
}
/*销毁*/
void销毁_堆栈(void)
{
assert(stack _ size 0);
stack _ size=0;
免费(栈);
stack=NULL
}
/*推送*/
void push(STACK_TYPE值)
{
断言(!is _ full());
top _ element=1;
stack[top_element]=值;
}
/*流行*/
无效弹出(无效)
{
断言(!is _ empty());
top _ element-=1;
}
/*顶部*/
堆栈类型顶部(空)
{
断言(!is _ empty());
返回堆栈[top _ element];
}
/* is_empty */
(同Internationalorganizations)国际组织是_empty(无效)
{
assert(stack _ size 0);
返回top _ element==-1;
}
/*是_满*/
int is_full(void)
{
assert(stack _ size 0);
return top _ element==stack _ size-1;
}
/*
** 定义一个打印函数,用来打印堆栈里面的元素。
*/
作废打印(作废)
{
int I;
i=顶部元素
printf(打印出动态数组堆栈里面的值: );
如果(i==-1)
printf(这是个空堆栈\ n’);
而(我!=-1)
printf(%d ,stack[I-]);
printf( \ n );
}
int main(void)
{
创建_堆栈(50);
print();
推(10);推(9);推(7);推(6);推(5);
推(4);推(3);推(2);推(1);推送(0);
printf(推送压入数值后:\ n’);
print();
printf( \ n );
pop();
pop();
printf(经过流行音乐弹出几个元素后的堆栈元素:\ n’);
print();
printf( \ n );
printf(top()调用出来的值:%d\n ,top());
destroy _ stack();
返回1;
}结果如下图:
三、链式堆栈
由于只有堆栈顶部元素才可以被访问,因此适用单链表可以很好实现链式堆栈,而且无长度限制。把一个元素压入堆栈是通过在链表头部添加一个元素实现。弹出一个元素是通过删除链表头部第一个元素实现。由于没有长度限制,故不需要创建_堆栈函数,需要销毁_堆栈进行释放内存以避免内存泄漏。
头文件stack.h不变,l_stack.c源代码如下:
[cpp]查看普通文本
/*
** 单链表实现堆栈,没有长度限制
*/
#includestack.h
# includestdio.h
# includemalloc.h
#includeassert.h
#定义假0
/*
** 定义一个结构以存储堆栈元素。
*/
数据类型说明结构堆栈节点
{
堆栈类型值;
struct STACK _ NODE * next
}堆栈节点
/* 指向堆栈中第一个节点的指针*/
静态堆栈节点*堆栈
/*创建堆栈*/
void create_stack(size_t size)
{}
/*销毁堆栈*/
空的销毁_堆栈(无效)
{
而(!is_empty())
pop();/* 逐个弹出元素,逐个释放节点内存*/
}
/*推送*/
空推(STACK_TYPE值)
{
堆栈节点*新节点
new _ node=(栈节点*)malloc(sizeof(栈节点));
如果(新节点==空)
perror( malloc fail );
新节点值=值;
new _ node-next=stack;/* 新元素插入链表头部*/
堆栈=新节点;/*堆栈重新指向链表头部*/
}
/*流行*/
无效弹出(无效)
{
堆栈节点*第一个节点
断言(!is _ empty());
first _ node=堆栈
stack=first _ node-next;
free(first _ node);
}
/*顶部*/
堆栈类型顶部(空)
{
断言(!is _ empty());
返回堆栈值;
}
/* is_empty */
(同Internationalorganizations)国际组织是_empty(无效)
{
返回堆栈==空
}
/*是_满*/
int is_full(void)
{
返回错误的
}
/*
** 定义一个打印函数,用来打印堆栈里面的元素。
*/
作废打印(作废)
{
堆栈节点* p _ node
p _ node=堆栈
printf(打印出链式堆栈里面的值: );
if(p_node==NULL)
printf(堆栈为空\ n’);
而(p_node!=空)
{
printf(%d ,p _ node-value);
p _ node=p _ node-next;
}
printf( \ n );
}
int main(void)
{
print();
推(10);推(9);推(7);推(6);推(5);
推(4);推(3);推(2);推(1);推送(0);
printf(推送压入数值后:\ n’);
print();
printf( \ n );
pop();
pop();
printf(经过流行音乐弹出几个元素后的堆栈元素:\ n’);
print();
printf( \ n );
printf(top()调用出来的值:%d\n ,top());
destroy _ stack();
返回1;
}结果如下图:
推荐教程:《java视频教程》以上是栈。有多少种方式可以实现?更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。