数据结构--栈队列

代码:

-#include<stdio.h>
#include<malloc.h>
 
/**
 * 链队列的结点
 */
typedef struct LinkNode{
    int data;
    struct LinkNode* next;
} *LinkNodePtr; 
 
/**
 * 链队列
 */
typedef struct LinkQueue{
    LinkNodePtr front;
    LinkNodePtr rear;
} *LinkQueuePtr; 
 
/**
 * 创建一个空的链队列
 */
LinkQueuePtr initQueue(){
    LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
    //头指针没有使用
    LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
    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("\r\n");
} //of outputLinkQueue
 
/**
 * 加入元素
 */
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement){
    //step 1. 创建一个新结点
    LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
    tempNodePtr->data = paraElement;
    tempNodePtr->next = NULL; 
    
    //step 2. 连接
    paraQueuePtr->rear->next = tempNodePtr;
    
    //step 3. 新的rear
    paraQueuePtr->rear = tempNodePtr; 
} // of enqueue
 
/**
 * 删除元素
 */
int dequeue(LinkQueuePtr paraQueuePtr){
    int resultValue;
    LinkNodePtr tempNodePtr;
    
    //step 1. 判断是否为空
    if(paraQueuePtr->front == paraQueuePtr->rear){
        printf("The queue is empty.\r\n");
        return -1;
    } //of if
    
    //step 2. 改变链队列
    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(tempNodePtr);
    tempNodePtr = NULL;
    
    //step 4. 返回
    return resultValue; 
} //of dequeue
 
/**
 * 测试
 */
void testLinkQueue(){
    LinkQueuePtr tempQueuePtr;
    tempQueuePtr = initQueue();
    enqueue(tempQueuePtr, 10);
    enqueue(tempQueuePtr, 30);
    enqueue(tempQueuePtr, 50);
    
    outputLinkQueue(tempQueuePtr);
    
    printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
    printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
    printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
    printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
    
    enqueue(tempQueuePtr, 8);
    outputLinkQueue(tempQueuePtr); 
} //of testLinkQueue
 
/**
 * The entrance.
 */
int main(){
    testLinkQueue();
    return 0;
} // of main

运行结果:

6abf2dc9eb5346748bf1de4f3fde33e9.jpg

 总结:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点。入队列:进行插入操作的一端称为队尾(rear);出队列:进行删除操作的一端称为队头(front)。 

 

而在上示代码中,我们定义的头节点没有放任何元素,所以在进行删除操作时发生改变的只是front的下一个结点。

 

 

  • 37
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值