学习的时候按照某一种方法去写,所以有些思维定势了;
以链表的形式去写栈,实际上栈不一定就要遵循后入栈的在链表的后面,也可以设计一个表头不存储数据,然后表头后面的就是最后入栈的节点以及出栈的节点;同样地也可以使得后入栈的在最后面,这样每次出栈或者入栈就需要先对表头进行循环直至尾节点。
同样地,对于队列的操作,不一定就非要使用链表的形式,也可以使用数组的形式,如下
//循环队列
#include "stdio.h"
#include "stdlib.h"
#define MaxSize 6
typedef struct Queue{
int front;
int rear;
int data[MaxSize-1];//牺牲了一个空间
}Queue;
Queue* init();
int Queue_in(Queue* Q,int data);
int Queue_out(Queue* Q);
void Q_print(Queue* Q);
int main(){
Queue* Q=init();
Queue_in(Q,1);
Queue_in(Q,2);
Q_print(Q);
Queue_in(Q,3);
Queue_in(Q,4);
Queue_in(Q,5);
Queue_in(Q,6);
Q_print(Q);
Queue_out(Q);
Q_print(Q);
Queue_out(Q);
Queue_out(Q);
Queue_in(Q,10);
Q_print(Q);
return 0;
}
Queue* init(){
Queue* Q=(Queue*) malloc(sizeof(Queue));
Q->front=0;
Q->rear=0;
return Q;
}
int Queue_in(Queue* Q,int data){
if(Q->front==(Q->rear+1)%MaxSize){
printf("The queue is full!\n");
return 0;
}
else{
Q->data[Q->rear]=data;
Q->rear=(Q->rear+1)%MaxSize;
return 1;
}
}
int Queue_out(Queue* Q){
if(Q->front==Q->rear){
printf("The queue is empty!\n");
return -1;
}
else{
int data=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
return data;
}
}
void Q_print(Queue* Q){
int length;
length=(Q->rear+6-Q->front)%MaxSize;
for(int i=Q->front;i<Q->front+length;i++){
printf("%d <- ",Q->data[i]);
}
printf("NULL\n");
}
最后学习数据结构一定不要思维定势,只是一个工具怎么方便怎么来。