zoukankan      html  css  js  c++  java
  • 计算机考研之数据结构-栈与队列

    数据结构-栈与队列

    定义

    一类操作受限的线性表。

    • :只允许在一端进行插入或者删除操作的线性表。

    • 栈顶:运行删除与插入的那一端。

    • 栈底:不允许删除和插入的另一端。

    • InitStack(&S),初始化。

    • StackEmpty,判空。

    • Push(&S, x),进栈。

    • Pop(&S, &x),出栈。

    • GetTop(S, &x),获得栈顶元素,但是不出栈。

    存储结构

    顺序存储
    定义

    typedef struct{
        int data[MAX];
        int top; //栈顶指针
    } SqStack;
    

    操作:

    void InitStack(SqStack &S){
        s.top=-1;
    }
    
    bool isEmpty(SqStack S){
        if(S.top==-1) return true;
        else return false;
    }
    
    bool Push(SqStack &S, int x){
        if(S.top==MAX-1) return false; // 栈满
        S.data[++S.top]=x;
        return true;
    }
    
    bool Pop(SqStack &S, int& x){
        if(S.top==-1) return false;
        x=S.data[S.top--];
        return true;
    }
    

    链式存储
    基本与链表同理。

    队列

    定义

    • 队列:只允许在一段进行插入,另一端进行删除

    • 队头:允许删除的一段

    • 队尾:允许插入的一段

    • InitQueue(&Q),初始化队列。

    • QueueEmpty(Q),判空。

    • EnQueue(&Q, x),入队。

    • DeQueue(&Q, &x),出队。

    存储

    顺序存储

    定义

    typedef struct{
        int data[MAX];
        int front, rear;
    }SqQueue;
    

    我们这里采用循环队列,注意一下几个操作的操作方式。

    • 判空:front==rear
    • 判满:(rear+1)%size==front
    • 队首指针前移:front=(front+1)%size
    • 队尾指针前移:rear=(rear+1)%size
    • 队列长度:(rear-front+size)%size

    操作

    void InitQueue(&Q){
        Q.rear=Q.front=0;
    }
    
    bool isEmpty(Q){
        if(Q.rear==Q.front) return true;
        else return false;
    }
    
    bool EnQueue(SqQueue &Q, int x){
        if((Q.rear+1)%MAX==Q.front) return false;
        Q.data[Q.rear]=x;
        Q.rear=(Q.rear+1)%MAX;
        return true;
    }
    
    bool DeQueue(SqQueue &Q, int &x){
        if(Q.rear==Q.front) return false;
        x=Q.data[Q.front];
        Q.front=(Q.front+1)%MAX;
        return true;
    }
    

    链式存储

    定义:

    typedef struct{
        int data;
        struct LinkNode *next;
    }LinkNode;
    
    typedef struct{
        LinkNode *front;
        LinkNode *rear;
    }LinkQueue;
    

    操作:

    void Init(LinkQueue &Q){
        Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
        Q.front->next=NULL;
    }
    
    void IsEmpty(LinkQueue Q){
        if(Q.front==Q.rear) return true;
        else return false;
    }
    
    bool EnQueue(LinkQueue &Q, int x){
        if((Q.rear+1)%MAX==Q.front) return false;
        s=(LinkNode*)malloc(sizeof(LinkNode));
        s->data=x; s->next=NULL;
        Q.rear->next=s;
        Q.rear=s;
        return true;
    }
    
    bool DeQueue(LinkQueue &Q, int &x){
        if(Q.front==Q.rear) return false;
        LinkNodep=Q.front->next;
        x=p->data;
        Q.front->next=p->next;
        if(Q.rear==p) Q.rear=Q.front;
        free(p);
        return true;
    }
    

    小结

    习题

  • 相关阅读:
    C#中的Virtual
    DevExpress控件中LayoutControl的使用
    汉字获取首字母拼音
    工具类
    C# 根据时间创建文件夹
    图片延迟加载
    IIS日志分析的作用
    SQL2008R2 无法读取此系统上以前注册的服务器的列表--网上方法不可行
    windows 服务器系统日志分析及安全
    301跳转
  • 原文地址:https://www.cnblogs.com/nevermoes/p/9872857.html
Copyright © 2011-2022 走看看