C语言|堆栈与队列

嵌入式技术

1372人已加入

描述

堆栈与队列都是抽象的数据类型,注意堆和栈不是同一个概念,这里的堆栈指的是栈;栈是一种具有后进先出的数据结构,又称为后进先出的线性表,简称 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;
}

 

结果如下:

堆栈

总结: 堆栈和队列获取的数据是反过来的, 本质就是改变数组下标实现, 并不会清除数组对应数据数据;

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分