嵌入式技术
堆栈与队列都是抽象的数据类型,注意堆和栈不是同一个概念,这里的堆栈指的是栈;栈是一种具有后进先出的数据结构,又称为后进先出的线性表,简称 LIFO(Last In First Out)结构。

队列是一种先进先出的数据结构,又称为先进先出的线性表,简称 FIFO(First In First Out)结构。

下面用数组来模拟一下堆栈与队列,用数组比较容易实现和理解,但是开辟的数组过大过小都不合适,当然也可以使用链表来实现;
数组实现堆栈:
#include "stdio.h"
#define MAXSTACK 10 // 堆栈最大容量
int stack[MAXSTACK]; // 定义一个数组
int top = -1; // 堆栈的顶部
// 判断堆栈是否为空
int isEmpty(void)
{
if( top == -1 ) return 1;
else return 0;
}
// 入栈
int push(int data)
{
if(top >= MAXSTACK-1)
{
// 堆栈已满
printf("full
");
return 0;
}
else
{
stack[++top] = data;
return 1;
}
}
// 出栈
int pop(void)
{
// 判断堆栈是否有数据
if(isEmpty())
{
return 0;
}
else
{
return stack[top--];
}
}
int main()
{
// 推入十个数据
for(int i=0; i<12; i++){
push(i);
}
// 获取十个数据
for(int i=0; i<12; i++){
printf("stack[%d]:%d
", i, pop());
}
printf("--------------
");
// 推入十个数据
for(int i=0; i<12; i++){
push(i);
}
// 获取十个数据
for(int i=0; i<12; i++){
printf("stack[%d]:%d
", i, pop());
}
printf("--------------
");
return 0;
}
结果如下:

数组实现队列:
#include "stdio.h"
#define MAXSTACK 10 // 定义队列的大小
int stack[MAXSTACK]; // 定义一个数组
int front = 0; // 队列的头
int rear = -1; // 队列的尾
// 判断队列是否为空
int isEmpty(void)
{
if( rear == -1 ){
return 0;
}else{
return 1;
}
}
// 添加数据
int push(int data)
{
if(rear >= MAXSTACK-1){
// 队列已满
printf("full
");
return 0;
}else{
stack[++rear] = data;
return 1;
}
}
// 获取数据
int pop(void)
{
// 判断队列是否有数据
if( isEmpty() )
{
rear--;
return stack[front++];
}
else{
// 重置
front = 0;
return 0;
}
}
int main()
{
// 推入十个数据
for(int i=0; i<12; i++){
push(i);
}
// 获取十个数据
for(int i=0; i<12; i++){
printf("stack[%d]:%d
", i, pop());
}
printf("--------------
");
// 推入十个数据
for(int i=0; i<12; i++){
push(i);
}
// 获取十个数据
for(int i=0; i<12; i++){
printf("stack[%d]:%d
", i, pop());
}
printf("--------------
");
return 0;
}
结果如下:

总结: 堆栈和队列获取的数据是反过来的, 本质就是改变数组下标实现, 并不会清除数组对应数据数据;
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !