嵌入式技术
堆栈与队列都是抽象的数据类型,注意堆和栈不是同一个概念,这里的堆栈指的是栈;栈是一种具有后进先出的数据结构,又称为后进先出的线性表,简称 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条评论
快来发表一下你的评论吧 !