单链表实现栈、队列:

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;
    }
}
复制代码

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;<br>        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;
}