双链表队列和栈的实现与操作

#include <iostream>
using namespace std;

// node definition
struct que_elem {
    que_elem* prev_p;
    que_elem* next_p;
    int data;

};


// queue definition

struct que_struct {

    que_elem* first_p;
    que_elem* last_p;
    int no_of_elem;
    int que_len;
};

//Enque:   enqueue a new element to queue tail
bool que_enq_el(que_struct  *que_p,
                que_elem    *el_p)
{
    if (que_p->first_p == NULL) // No elements in queue.
    {
        que_p->first_p = el_p;
        que_p->first_p->next_p = NULL;
        que_p->first_p->prev_p = NULL;
        que_p->last_p = que_p->first_p;
        que_p->no_of_elem = 1;
        return(true);
    }
    else if (que_p->no_of_elem < que_p->que_len)
    {
        que_p->last_p->next_p = el_p;
        el_p->prev_p = que_p->last_p;
        que_p->last_p = el_p;
        que_p->last_p->next_p = NULL;
        que_p->no_of_elem++;
        return(true);
    }
    return(false);

}

  //Dequeue: dequeue element from queue head
bool que_deq_el(que_struct  *que_p,
                que_elem    **el_p)
{
    if (que_p->first_p != NULL) // There are elements in the queue!
    {
        *el_p = que_p->first_p;

        if (que_p->first_p == que_p->last_p) // There is exactly one element in teh queue.
        {
            que_p->first_p = NULL;
            que_p->last_p = NULL;
            que_p->no_of_elem = 0;
        }
        else
        {
            que_p->first_p = que_p->first_p->next_p;
            que_p->first_p->prev_p = NULL;
            que_p->no_of_elem--;
        }

        return(true);
    }
    return(false);

} /* end que_deq_el */

//  extract and cut  the link with a specific element
void extract_el_from_queue(que_struct  *que_p,
                           que_elem    *el_p)
{
    if (que_p->first_p == que_p->last_p) // One element in the queue.
    {
        que_p->first_p = NULL;
        que_p->last_p = NULL;
        que_p->no_of_elem = 0;
    }
    else if (el_p == que_p->first_p)
    {
        que_p->first_p = que_p->first_p->next_p;
        que_p->first_p->prev_p = NULL;
        que_p->no_of_elem--;
    }
    else if (el_p == que_p->last_p)
    {
        que_p->last_p = que_p->last_p->prev_p;
        que_p->last_p->next_p = NULL;
        que_p->no_of_elem--;
    }
    else
    {
        el_p->prev_p->next_p = el_p->next_p;
        el_p->next_p->prev_p = el_p->prev_p;
        que_p->no_of_elem--;
    }

}

  //  initial the queue
void initial_queue(que_struct *que_p)
{
    que_p->first_p = NULL;
    que_p->last_p = NULL;
    que_p->que_len = 10;
    que_p->no_of_elem = 0;
}

 //  Clear the queue
void clear_queue(que_struct *que_p)
{
    que_elem   *tmp1_p, *tmp2_p;

    tmp1_p = que_p->first_p;
    
    while (tmp1_p != NULL)
    {
        tmp2_p = tmp1_p->next_p;
        delete tmp1_p;
        tmp1_p = tmp2_p;
    }
    que_p->first_p = NULL;
    que_p->last_p = NULL;
    que_p->no_of_elem = 0;
}

//  Print the queue
void print_queue(que_struct *que_p)
{
    que_elem *tmp1_p;
    tmp1_p = que_p->first_p;

    if (tmp1_p == NULL)
    {
        cout << "The queue is a empty" << endl;
        return;
    }

    while (tmp1_p != NULL)
    {
        cout<<"The element's data is "<<tmp1_p->data<<endl;
        tmp1_p = tmp1_p->next_p;
    }
}

/***********************************************************************
   **********    it's stack turn*******************************************
************************************************************************/
struct  stack_struct
{
    que_elem         *top_p;
    que_elem         *bot_p;
    int              no_of_elem;
    int              stack_len;
};

// push stack
bool stack_push_el(stack_struct  *stack_p,
                   que_elem      *el_p)
{
    que_elem   *tmp_p;

    if (stack_p->top_p == NULL) // No elements in stack.
    {
        stack_p->top_p = el_p;
        stack_p->top_p->next_p = NULL;
        stack_p->top_p->prev_p = NULL;
        stack_p->bot_p = stack_p->top_p;
        stack_p->no_of_elem = 1;
        return(true);
    }
    else if (stack_p->no_of_elem < stack_p->stack_len)
    {
        stack_p->top_p->prev_p = el_p;
        el_p->next_p = stack_p->top_p;
        stack_p->top_p = el_p;
        stack_p->no_of_elem++;
        return(true);
    }
    
    return(false);
}

  // pop stack
bool stack_pop_el(stack_struct  *stack_p,
                  que_elem      **el_p)
{

    if (stack_p->top_p != NULL) // There are elements in stack.
    {
        *el_p = stack_p->top_p;

        if (stack_p->top_p == stack_p->bot_p) // One element in stack.
        {
            stack_p->top_p = NULL;
            stack_p->bot_p = NULL;
            stack_p->no_of_elem = 0;
        }
        else
        {
            stack_p->top_p = stack_p->top_p->next_p;
            stack_p->top_p->prev_p = NULL;
            stack_p->no_of_elem--;
        }
        return(true);
    }
    return(false);
}


// initial the stack

void initial_stack(stack_struct *stack_p)
{
    stack_p->top_p = NULL;
    stack_p->bot_p = NULL;
    stack_p->no_of_elem--;
    stack_p->stack_len = 10;
}


//clear the stack

void clear_stack(stack_struct *stack_p)
{
    que_elem   *tmp1_p, *tmp2_p;

    tmp1_p = stack_p->top_p;

    while (tmp1_p != NULL)
    {
        tmp2_p = tmp1_p->next_p;

        delete tmp1_p;
        tmp1_p = tmp2_p;
    }
    stack_p->top_p = NULL;
    stack_p->no_of_elem = 0;
}

//print the stack
void print_stack(stack_struct *stack)
{
    que_elem *tmp_p;
    tmp_p = stack->top_p;
    if (tmp_p == NULL)
    {
        cout << "The stack is empty" << endl;
    }
    while (tmp_p != NULL)
    {
        cout << "stack element data value: " << tmp_p->data<<endl;
        tmp_p = tmp_p->next_p;
    }

}



/********************************main: operation and  test********************************************************/
int main(void)
{

    cout << "*************queue******************" << endl;
    que_struct que;
    initial_queue(&que);
    print_queue(&que);

    int ele_no = 2;
    for (int i = 0; i < ele_no;i++)
    {
    que_elem *elem1_p = new que_elem();
    elem1_p->data = i;
    que_enq_el(&que,elem1_p);
    }
    print_queue(&que);
    
    clear_queue(&que);
    print_queue(&que);
    
    
    cout << "************stack*******************" << endl;
    stack_struct stack;
    initial_stack(&stack);
    print_stack(&stack);

    que_elem *elem3_p = new que_elem();
    elem3_p->data = 8;
    stack_push_el(&stack, elem3_p);
    print_stack(&stack);

    clear_stack(&stack);
    print_stack(&stack);

    char ch;
    cin>>ch;
    return 0;
}
/* * 基于双向链表实现双端队列结构 */ 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、付费专栏及课程。

余额充值