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; }