栈
顺序栈
两栈共享空间:对于两个相同数据类型的栈,可以用数组的两端作为栈低的方法来趟两个栈共享数据,从而最大化的利用数组空间
链栈
队列:是只允许在一端进项插入操作,而在另一端进行删除操作的线性表,它是一种先进先出(First In First Out )的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。如键盘的输入到显示器上的显示就是队列的例子
顺序队列
循环队列:为了避免数组插入和删除使需要移动数据,于是引入了循环队列,使得队头和队尾可以在数组中循环变化,解决了移动数据的时间损耗
链队列
.循环队列是事先申请好空间,使用期间释放,链队栈,每次申请和释放结点也会存在一些时间开销。在可以确定队列的最大值的情况下,建议用循环队列
#include<stdio.h>
#define size 5
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status ;
typedef int elementType;
typedef struct
{
elementType data[size];
int front;//头指针
int rear;//尾指针
}sqQueue;
Status init(sqQueue *queue){//初始化队列
queue->front = 0;
queue->rear = 0;
return OK;
}
int getQueueLength(sqQueue * queue){//求队列的长度,通用的是 ((rear + 0) + (size - front))%size
return (queue->rear +size - queue->front)%size;
}
Status add(sqQueue * queue,elementType element){//在队列尾部插入元素
if((queue->rear + 1)%size == queue->front ){//判断队列是否已满,采用的是头指针与尾指针是否相差一个
return ERROR;
}
queue->data[queue->rear] = element;//rear指针向后移一位,若到最后就转到数组头部
queue->rear = (queue->rear + 1)%size;
return OK;
}
Status dele(sqQueue *queue,elementType *element){//队列空的判断
if(queue->rear == queue->front){
return ERROR;
}
*element = queue->data[queue->front];//把删除的值赋给element
queue->front = (queue->front+ 1)%size;//若到最后则转到数组头部
return OK;
}
void print(sqQueue *queue){//打印
int a = queue ->front;
int i;
for( i = a ; i != queue->rear; a++, i = a%size ){
printf("%d\t",queue->data[i]);
}
puts("");
}
void main()//测试代码
{
sqQueue queue ;
elementType i = 0;
int deleteElement;
init(&queue);
for( ; i<4 ; i++){
add(&queue,i);
}
print(&queue);
dele(&queue,&deleteElement);
dele(&queue,&deleteElement);
add(&queue,7);
print(&queue);
add(&queue,8);
print(&queue);
}