- 老师代码
- 接口定义
- 数据定义
- 链式队列
- 循环队列
队列是一种后进后出的结构 老师代码
循环
#include#include #define TOTAL_SPACE 5 typedef struct CircleIntQueue{ int data[TOTAL_SPACE]; int head; int tail; }*CircleIntQueuePtr; CircleIntQueuePtr initQueue() { CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue)); resultPtr->head = 0; resultPtr->tail = 0; return resultPtr; }// Of the first constructor void enqueue(CircleIntQueuePtr paraPtr, int paraValue) { if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) { printf("Queue full.rn"); return; } // Of if paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue; paraPtr->tail++; }// Of enqueue int dequeue(CircleIntQueuePtr paraPtr) { int resultValue; if (paraPtr->head == paraPtr->tail) { printf("No element in the queue.rn"); return -1; } // Of if resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE]; paraPtr->head++; return resultValue; }// Of dequeue void outputLinkQueue(CircleIntQueuePtr paraPtr){ int i; if (paraPtr->head == paraPtr->tail) { printf("Empty queue."); return; } // Of if printf("Elements in the queue: "); for (i = paraPtr->head; i < paraPtr->tail; i++) { printf("%d, ", paraPtr->data[i % TOTAL_SPACE]); } // Of for i printf("rn"); }//Of outputLinkQueue void testLinkQueue(){ int i = 10; CircleIntQueuePtr tempPtr = initQueue(); for (; i < 16; i ++) { enqueue(tempPtr, i); }//Of for i outputLinkQueue(tempPtr); for (i = 0; i < 6; i ++) { printf("dequeue gets %drn", dequeue(tempPtr)); }//Of for i enqueue(tempPtr, 8); outputLinkQueue(tempPtr); }//Of testLinkQueue int main(){ testLinkQueue(); return 1; }//Of main
链式
#include接口定义#include typedef struct LinkNode{ int data; LinkNode* next; }*LinkNodePtr; typedef struct LinkQueue{ LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; LinkQueuePtr initQueue(){ LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue)); //The header, the data is not useful. LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNodePtr)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; }//Of initQueue void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; }//Of while printf("rn"); }//Of outputLinkQueue void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { //Step 1. Create a new node LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); tempNodePtr->data = paraElement; tempNodePtr->next = NULL; //Step 2. Link to the existing rear paraQueuePtr->rear->next = tempNodePtr; //Step 3. It is the new rear paraQueuePtr->rear = tempNodePtr; }//Of enqueue int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //Step 1. Is the queue empty? if (paraQueuePtr->front == paraQueuePtr->rear) { printf("The queue is empty.rn"); return -1; }//Of if //Step 2. Change the queue. tempNodePtr = paraQueuePtr->front->next; resultValue = tempNodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if (paraQueuePtr->rear == tempNodePtr) { paraQueuePtr->rear = paraQueuePtr->front; }//Of if //Step 3. Free space. // free(tempNodePtr); tempNodePtr = NULL; //Step 4. Return. return resultValue; }//Of enqueue void testLinkQueue(){ LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); outputLinkQueue(tempQueuePtr); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); enqueue(tempQueuePtr, 8); outputLinkQueue(tempQueuePtr); }//Of testLinkQueue int main(){ testLinkQueue(); return 1; }//Of main
interface Queue数据定义{ var length: Int fun push(e: T): Boolean fun pop(): Boolean fun empty(): Boolean fun top(): T }
data class Node链式队列( var data: T, var next: Node ? )
class LinkedQueue循环队列: Queue { private var head: Node ? = null private var rear: Node ? = null override var length: Int = 0 override fun push(e: T): Boolean { if (head == null) { head = Node(e, null) rear = head } else { val temp = Node(e, null) rear?.next = temp rear = temp } length++ return true } override fun pop(): Boolean { return if (empty()) { false } else { head = head?.next length-- true } } override fun empty(): Boolean = length == 0 override fun top(): T = head!!.data }
class ArrayQueue(private var size: Int = 5): Queue { private var head: Int = 0 private var rear: Int = 0 private var data: ArrayList = ArrayList(size) override var length: Int = 0 override fun push(e: T): Boolean { return if (full()) { false } else { data[rear++ % size] = e true } } fun full(): Boolean = length == size override fun pop(): Boolean { return if (empty()) { false } else { head %= size head++ true } } override fun empty(): Boolean = length == 0 override fun top(): T = data[rear - 1] }



