zoukankan      html  css  js  c++  java
  • 栈&队列

    1.栈

      栈的定义:只允许在一端进行插入和删除操作的线性表

      栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为Cn2n/(n+1),这个公式称为卡特兰数

      栈及其操作的实现:

        以顺序表为存储结构的栈:

    /**@数据结构:栈->顺序栈 
     **@作者:9761滴 
     **@实现方式:静态分配(即分配固定大小的数组,数组长度不可变) 
     **/ 
    
    //一种数据结构的操作无非 创建删除,增删改查
    //本文件中实现了顺序栈的
        /*1.init
         **2.push
        **3.pop
        **4.getHead 
        **5.isEmpty
        */ 
    //等操作 
    #include<cstdio>
    #define MAX_SIZE 10
    typedef int ElementType;
    typedef struct{
        ElementType data[MAX_SIZE];
        int top;
    }SqStack;
    bool isEmpty(SqStack stack);
    bool init(SqStack &stack){
        stack.top=-1;
        return true;
    }
    bool push(SqStack &stack,ElementType x){
        if(stack.top==MAX_SIZE-1)
            return  false;
        stack.data[++stack.top]=x;
        return true;
    }
    bool pop(SqStack &stack,ElementType &x){
        if(isEmpty(stack))
            return  false;
        x=stack.data[stack.top--];
        return true;
    }
    ElementType getTop(SqStack stack){
        if(isEmpty(stack)){
            printf("stack is already empty");
            return  -1;
        }
        return stack.data[stack.top];
    }
    bool isEmpty(SqStack stack){
        return stack.top==-1;
    }

      

        带头节点的链栈:

    /**@数据结构:栈->链栈 
     **@作者:9761滴 
     **@是否带头结点:是 
     **/ 
    
    //本文件中实现了链栈的
        /*1.init
         **2.push
        **3.pop
        **4.getHead 
        **5.isEmpty
        */ 
    //等操作 
    #include<cstdio>
    #include<stdlib.h> 
    using namespace std;
    typedef char ElementType; 
    typedef struct LNode{
        ElementType data;
        LNode *next;
    }LNode,*LStack;
    bool isEmpty(LStack &LS);
    bool init(LStack &LS){
        LS=(LNode*)malloc(sizeof(LNode));
        if(LS==NULL){
            return false;
        }
        LS->next=NULL;
        return true;
    }
    bool push(LStack &LS,ElementType x){
        LNode* LN=(LNode*)malloc(sizeof(LNode));
        if(LN==NULL)
            return false;
        LN->next=LS->next;
        LN->data=x;
        LS->next=LN;
    }
    
    bool pop(LStack &LS,ElementType &x){
        if(isEmpty(LS))
            return false;
        LNode* LN=LS->next;
        LS->next=LS->next->next;
        x=LN->data;
        free(LN);
    }
    
    ElementType getHead(LStack &LS){
        if(isEmpty(LS)){
            printf("Stack is already empty");
            return -1;
        }
        return LS->next->data;
    }
    bool isEmpty(LStack &LS){
        return LS->next==NULL;
    }

       

        不带头节点的链栈:

    /**@数据结构:栈->链栈 
     **@作者:9761滴 
     **@是否带头结点:否  
     **/ 
    
    //本文件中实现了链栈的
        /*1.init
         **2.push
        **3.pop
        **4.getHead 
        **5.isEmpty
        */ 
    //等操作
    #include<cstdio>
    #include<stdlib.h>
    typedef int ElementType;
    typedef struct LNode{
        ElementType data;
        LNode *next;
    }LNode,*LStack;
    bool isEmpty(LStack LS);
    bool init(LStack &LS){
        LS==NULL;
    } 
    bool push(LStack &LS,ElementType x){
        if(LS==NULL){
            LS=(LNode*)malloc(sizeof(LNode));
            if(LS==NULL)
                return false;
            LS->data=x;
            LS->next=NULL;
        }
        else{
            LNode *LN=(LNode*)malloc(sizeof(LNode));
            if(LN==NULL)
                return false;
            LN->data=x;
            LN->next=LS;
            LS=LN;
        }
        return true;
    }
    bool pop(LStack &LS,ElementType &x){
        if(isEmpty(LS)){
            printf("Stack is already empty");
            return false;
        }
        else{
            LNode *LN=LS;
            x=LN->data;
            LS=LS->next;
            free(LN);
        }
        return true;
    }
    ElementType getHead(LStack LS){
        if(isEmpty(LS)){
            printf("Stack is already empty");
            return false;
        }
        else{
            ElementType x=LS->data;
            return x;
        }
    
    }
    bool isEmpty(LStack LS){
        return LS==NULL;
    }

    2.队列

      队列定义:只能在一端进行插入,在另一端进行删除的线性表,允许插入的一端叫做队尾,允许删除的一段叫做队头

      队列及其操作的实现:

        顺序队列:

    /**@数据结构:队列->循环队列 
     **@作者:9761滴 
     **@实现方式:静态分配(即分配固定大小的数组,数组长度不可变) 
     **@rear指向最后一个元素的下一个元素 
     **/ 
    
    //一种数据结构的操作无非 创建删除,增删改查
    //本文件中实现了循环队列的
        /*1.init
         **2.enQueue 
        **3.deQueue
        **4.getHead 
        **5.isEmpty
        */ 
    //等操作 
    #include<cstdio>
    #define MAX_SIZE 10
    typedef int ElementType;
    typedef struct SqQueue{
        ElementType data[MAX_SIZE];
        int front,rear;
    //    int size;    方便判断队空或者队满
    //    int tag;    方案二    ,入队之后置为1,出队之后置为0        
    }Queue;
    bool init(Queue &Q){
        Q.front=Q.rear=0;
    //  Q.size=0; 
    //    Q.tag=0;
        return true;
    }
    bool enQueue(Queue &Q,ElementType x){
        if((Q.rear+1)%MAX_SIZE==Q.front)
    //        if(size==MAX_SIZE)
    //        if(Q.tag==1&&Q.rear=Q.front)
            return false;
        Q.data[Q.rear]=x;
        Q.rear=(Q.rear+1)%MAX_SIZE;
    //    Q.size++;
    //    Q.tag=1;
        return true;
    }
    bool deQueue(Queue &Q,ElementType &x){
        if(Q.rear==Q.front)
    //    if(Q.size==0)
    //    if(Q.tag==0&&Q.rear=Q.front)
            return false;
        x=Q.data[Q.front];
        Q.front=(Q.front+1)%MAX_SIZE;
    //    Q.size--;
    //    Q.tag=0;
        return true;
    }
    bool getHead(Queue Q,ElementType &x){
        if(Q.front==Q.rear)
    //    if(Q.size==0)
    //    if(Q.tag==0&&Q.rear=Q.front)
            return false;
        x=Q.data[Q.front];
        return true;
    }
    bool isEmpty(Queue Q){
        if(Q.front==Q.rear)
    //    if(Q.size==0)
            return true;
        return false;
    }

        链队列:

    /**@数据结构:队列->链队列 
     **@作者:9761滴 
     **@带头结点 
     **/ 
    
    //本文件中实现了链队列的
        /*1.init
         **2.enQueue 
        **3.deQueue
        **4.getHead 
        **5.isEmpty
        */ 
    //等操作 
    #include<cstdio>
    #include<stdlib.h>
    typedef int ElementType;
    typedef struct LNode{
        ElementType data;
        LNode* next;
    }LNode;
    typedef struct LQueue{
        LNode* front;
        LNode* rear;
    }LQueue;
    bool init(LQueue &Q){
        Q.front=Q.rear=(LNode*)malloc(sizeof(LNode));
        if(Q.front==NULL||Q.rear==NULL)
            return false;
        Q.front->next=NULL;
        return true;
    }
    bool enQueue(LQueue &Q,ElementType x){
        LNode* L=(LNode*)malloc(sizeof(LNode));
        if(L==NULL)
            return false;
        L->data=x;
        L->next=NULL;
        Q.rear->next=L;
        Q.rear=L;
        return true;
    }
    bool deQueue(LQueue &Q,ElementType &x){
        if(Q.front==Q.rear)
            return false;
        LNode* L=Q.front->next;
        x=L->data;
        Q.front->next=L->next;
        if(Q.rear==L)            //如果删除的是最后一个结点,需要修改rear,使其指向头结点 
            Q.rear=Q.front;
        free(L);
        return true;
    }
    bool getHead(LQueue Q,ElementType &x){
        if(Q.front==Q.rear)
            return false;
        x=Q.front->next->data;
        return true;
    }
    bool isEmpty(LQueue Q) {
        if(Q.front==Q.rear)
            return true;
        return false;
    }
    int main(){
        LQueue Q;
        init(Q);
        return 0;
    }

        不带头节点的链队列:

    /**@数据结构:队列->链队列 
     **@作者:9761滴 
     **@不带头结点 
     **/ 
    
    //本文件中实现了链队列的
        /*1.init
         **2.enQueue 
        **3.deQueue
        **4.getHead 
        **5.isEmpty
        */ 
    //等操作 
    #include<cstdio>
    #include<stdlib.h>
    typedef int ElementType;
    typedef struct LNode{
        ElementType data;
        LNode* next;
    }LNode;
    typedef struct LQueue{
        LNode* front;
        LNode* rear;
    }LQueue;
    bool init(LQueue &Q){
        Q.front=Q.rear=NULL;
        return true;
    }
    bool enQueue(LQueue &Q,ElementType x){
        LNode* L=(LNode*)malloc(sizeof(LNode));
        if(L==NULL)
            return false;
        L->data=x;
        L->next=NULL;
        if(Q.rear==NULL){
            Q.front=Q.rear=L;
        }
        else{
            Q.rear->next=L;
            Q.rear=L;
        }
    
        return true;
    }
    bool deQueue(LQueue &Q,ElementType &x){
        if(Q.front==NULL)
            return false;
        LNode* L=Q.front;
        x=L->data;
      Q.front->next=L->next; 
    if(Q.rear==L) //如果删除的是最后一个结点,需要修改rear,使其指向头结点 Q.rear=Q.front==NULL; free(L); return true; } bool getHead(LQueue Q,ElementType &x){ if(Q.front==NULL) return false; x=Q.front->data; return true; } bool isEmpty(LQueue Q) { if(Q.front==NULL) return true; return false; }

        

  • 相关阅读:
    Android WIFI 启动流程(TIP^^)
    MVVM模式原则
    CoreData入门
    转:iOS绘制一个UIView
    CGBitmapContextCreate函数参数详解
    RACCommand
    ReactiveCocoa内存管理
    IOS TableView滑动不灵敏问题
    IOS数组的排序和筛选
    IOS取消performSelector警告
  • 原文地址:https://www.cnblogs.com/foodie-nils/p/13965846.html
Copyright © 2011-2022 走看看