ds:单链表实现栈、单链表实现队列的思想

 

单链表实现栈、队列:

1.单链表实现的栈/队列也可以细分为不带头结点的单链表实现、带头结点的单链表实现,这两种细分对栈/队列的实现是大同小异的。

2.单链表实现栈的思想:入栈就是单链表的头插法,出栈就在单链表表尾出栈

3.单链表实现队列的思想:定义结点、定义*front、*rear指针,入队相当于在单链表尾插法(LNdoe s = (LNode *)malloc(sizeof(LNode)); Q.rear = s;),出队就是在单链表表头逐个删除元素(q= Q.front->next; e=  q->data; Q.front->next = q->next; free(q); 这几句是带头结点的实现伪代码,不带头结点的要把Q.front->next = q->next改成Q.front = q->next,当然具体其他细节也要改)。

 

附代码:

1.单链表实现栈

// 单链表定义栈(带头结点)
typedef struct sNode{
    int data;
    struct sNode *next;
}sNode,*LinkStack;

bool init(LinkStack &L){
    L->next == NULL;
    return true;
}

bool empty(LinkStack L){
    if (L->next == NULL){
        return true;
    }else{
        return false;
    }
}

 

2.单链表实现队列

// 单链表定义队列(带头结点)
typedef struct LinkNode{
    int data;
    struct LinkNode *next;
}LinkNode;

typedef struct{
    LinkNode *rear,*front;
}LinkQueue;

bool init(LinkQueue &Q){
    Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
    Q.front->next = NULL;       // 带头结点的单链表实现的队列
    return true;
}

bool empty(LinkQueue Q){
    if(Q.front == Q.rear){
        return true;
    }else{
        return false;
    }
}

 注意:链队出队要判断两次空:判队空;判断出队结点是否是最后一个结点

bool outQueue(LinkQueue &Q,int &e){
    if(isEmpty(Q)){     // 出队:判队空
        return false;
    }
    Node *p = Q.front->next;
    e = p->data;
    if(Q.rear == p){    // 出队:判断出队结点是否是最后一个结点
        Q.rear = Q.front;
Q.front->next = NULL; free(p); cout << "deQueue suc, current queue is empty, data: " << e << endl; return true; } Q.front->next = p->next; free(p); cout << "deQueue suc, data: " << e << endl; return true; }

  

  

posted @ 2023-05-11 11:18  _titleInfo  阅读(29)  评论(0编辑  收藏  举报
//雪花飘落效果