用双向链表实现一个栈和队列

下面将介绍一下,如何使用双向链表来分别实现“堆栈”和“队列”,其中有的部分是一样,所以就直接调用了。

堆栈:后进先出,入栈和出栈都是在栈顶进行;

队列:先进先出,在队列尾插入元素,从队列头删除元素。

#include<stdio.h>
#include<stdlib.h>
#include"stack.h"

// 判断堆栈是否为空  
// 为空,返回1;不为空,返回0 
static int StackIsEmpty(List *plist)
{
	if(plist->count==0)
		return 1;
	else
		return 0;
}

// 判断堆栈是否为满  
// 为满,返回1;不为满,返回0  
static int StackIsFull(List *plist)
{
	if(plist->count==plist->max)
		return 1;
	else
		return 0;
}

// 堆栈初始化  
// 建立一个带哨兵的空链表  
// 失败,返回0;成功:返回1  
int StackInit(List *plist,int length)
{
	struct node* pnew;
	pnew=(struct node*)malloc(sizeof(struct node));
	if(pnew==0)
	{
		return 0;
	}
	pnew->next=pnew;
	pnew->prev=pnew;
	plist->head=pnew; //哨兵元素,头指针指向头结点
	
	plist->count=0;
	plist->max=length;
	
	return 1;	
}

//压栈(在双向链表的头部添加一个元素)
// 将元素添加到链表头(哨兵元素之后)  
// 成功,返回1;失败,返回0  
int StackPush(List *plist,Item item)
{
	struct node *pnew;
	if(StackIsFull(plist))//若栈满,返回0
		return 0;
	pnew=(struct node*)malloc(sizeof(struct node));
	if(pnew==0)
		return 0;
	
	pnew->item=item;
	pnew->prev=plist->head;
	pnew->next=plist->head->next;
	plist->head->next->prev=pnew;
	
	(plist->count)++;
	return 1;
	
}

//出栈(在双向链表的头部删除一个元素)
//失败,返回0;成功,返回1
int StackPop(List *plist,item *pitem)
{
	struct node *pde1;
	if(StackIsEmpty(plist))
		return 0;
	
	pde1=plist->head->next;
	*pitem=pde1->item;
	pde1->next->prev=plist->head;// 改变下一个节点的前向指针
	plist->head->next=pde1->next;
	free(pde1);//释放内存
	(plist->count)--;
	
	return 1;
	
}

//队列初始化(和栈的初始化的一样的)
int QueueInit(List *plist,int length)
{
	return StackInit(plist,length);
}

//添加元素到队尾
int EnQueue(List *plist,Item item)  
{  
    struct node *pdel;
	if(StackIsFull(plist))//若队列为满,返回0
		return 0;
	pde1=(struct node*)malloc(sizeof(struct node));
	if(pde1==0)
		return 0;
	
	pde1->item=item;//待插入的元素item
	pde1->next=plist->head;
	plist->head->prev=pde1;
	
	(plist->count)++;
	return 1;
}  
  
// 从队头删除元素  
int DeQueue(List *plist,Item *pitem)  
{  
	return StackPop(plist,pitem);
}


/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值