zoukankan      html  css  js  c++  java
  • 数据结构读书笔记第三章 栈和队列

    3.1  栈的定义

      栈是限制在表的一端进行插入和删除操作的线性表.允许进行插入,删除操作的一端是栈顶.另一个固定端称为栈底,当表中美柚元素时候称为空栈.是一种后进先出的线性表.

    3.2 栈的顺序存储和运算实现

    #define MaxSize 100
    typedef int DataType;
    //栈的顺序存储定义
    typedef struct 
    {
            DataType data[MaxSize];
            int top;
    }Stack;
    
    //栈的初始化
    Stack *Init_Stack()
    {
            Stack *s;
            s=new Stack;
            if(!s)
                return NULL;
            else
            {
                    s->top=-1;
                    return s;
            }
    }
    
    int isEmpty_Stack(Stack *s)
    {
            if(s->top==-1)
                return 1;
            else 
                return 0;
    }
    
    int Push_Stack(Stack *s,int x)
    {
            if(s->top==MaxSize-1)
                return NULL:
            else
            {
                    s->top++;
                    s->data[top]=x;
                    return 1;
            }
    }
    int Pop_Stack(Stack *s,int *x) { if(isEmpty_Stack(s)) return 0; else { *x=s->data[top]; x->top--; return 1; } } DataType Top_Stack(Stack *s) { if(isEmpty_Stack(s)) return 0; else return s->data[top]; }

    3.3 栈的链式存储和运算

    typedef struct Node{
            DataType data;
            struct Node *next;
    }SNode,*LinkStack;
    
    LinkStack *Init_Stack()
    {
            return NULL;
    }
    
    int isEmpty_Stack(LinkStack top)
    {
            if(top==NULL)
                    return 1;
            else
                    return 0;
    }
    
    LinkStack Push_Stack(LinkStack top,DataType x)
    {
            SNode *p;
            p=new SNode;
            s->data=x;
            s->next=top;
            top=s;
            return top;
    }
    
    LinkStack Pop_Stack(LinkStack top,DataType *x)
    {
            SNode *p;
            if(top==NULL)
                    return NULL;
            else
            {
                    *x=top->data;
                    p=top;
                    top=p->next;
                    delete p;
                    return top;
            }
    }
    

    3.4 栈的应用

    typedef int DataType;
    void conversion(int N,int r)   //进制转化
    {
        Stack s;
        DataType x;
        Init_Stack(&s);
        while(N)
        {
            Push_Stack(&s,N%r);
            N=N/r;
        }
        while(!isEmpty_Stack(&s))
        {
            Pop_Stack(&s,x)
            cout<<x;
        }
        cout<<endl;
    }
    
    void conversion(int N,int r)
    {
        int S[100],top;
        int x;
        int top=-1;
        while(N)
        {
            s[++top]=N%r;
            N=N/r;
        }
        while(top!=-1)
        {
            x=s[top-1];
            cout<<x;
        }
        cout<<endl;
    }
    
    int Path(int maze[m][n],int move[8])   //迷宫的走法
    {
        Stack s;
        DataType tmp;
        int x,y,d,i,j;
        tmp.x=1;
        tmp.y=1;
        tmp.d=-1;
        Push_Stack(s,tmp);
        while(!isEmpty_Stack(s))
        {
            Pop_Stack(s,tmp);
            x=tmp.x;
            y=tmp.y;
            d=tmp.d+1;
            while(d<8)
            {
                i=x+move[d].x;
                j=y+move[d].y;
                if(maze[i][j]==0)
                {
                    temp={x,y,d};
                    Push_Stack(s,tmp);
                    x=i;
                    y=j;
                    maze[x][y]=-1;
                    if(x==m&&y==n)
                        return 1;
                    else
                        d=0;
                }
                else
                    d++;
            }
        }
        return 0;
    } 
    

    3.5  队列的定义

      队列是一种先进先出的数据结构,即插入操作在表一端进行,而删除操作在表的另一端进行,将这种数据结构称为队或者队列,把允许进行掺入操作的一端叫做队尾.

    由于一般的队列,会出现假溢出的现象,我们接下来讨论的一般是循环队列

    3.6  循环队列的顺序存储和运算

    typedef struct 
    {
            DataType data[MaxSize];
            int front,rear;
            int num;
    }SeQueue;
    
    SeQueue *Init_SeQueue()
    {
            SeQueue q;
            q=new SeQueue;
            q->front=q->rear=MaxSize-1;
            q->num=0;
            return q;
    }
    
    int In_SeQueue(SeQueue *q,DataType x)
    {
            if(q->num==MaxSize-1)
                return 0;
            else
            {
                    q->rear=(q->rear+1)%MaxSize;
                    q->data[q->rear]=x;
                    q->num++;
                    return 1;
            }
    }
    
    int Out_SeQueue(SeQueue *q,DataType *x)
    {
            if(q->num==0)
                return 0;
            else
            {
                    q->front=(q->front+1)%MaxSize;
                    *x=q->data[q->front];
                    q->num--;
                    return 1;
            }
    }
    
    int Empty_SeQueue(SeQueue *q)
    {
            if(q->num==0)
                return 1;
            else
                return 0;
    }
    

    3.7 队列的链式存储

    #define MaxSize 100
    typedef struct {
        DataType data[MaxSize];
        int rear,front;
        int num;
    }SeQueue;
    
    SeQueue *Init_SeQueue()
    {
        SeQueue q;
        q=new SeQueue;
        q->front=q->rear=MaxSize-1;
        q->num=0;
        return q;
    }
    
    int In_SeQueue(SeQueue *q,DataType x)
    {
        if(q->num==MaxSize)
            return 0;
        else
        {
            q->rear=(q->rear+1)%MaxSize;
            q-data[q->rear]=x;
            q->num++;
            return 1;
        }
    }
    
    int Out_SeQueue(SeQueue *q,DataType *x)
    {
        if(q->num==0)
            return 0;
        else
        {
            q->front=(q->front+1)%MaxSize;
            *x=q->data[front];
            q->num--;
            return 1;
        }
    }
    
    int Empty_SeQueue(SeQueue *q)
    {
        if(q->num==0)
            return 1;
        else
            return 0;
    }
    
    typedef struct Node{
        DataType data;
        struct Node *next;
    }QNode;
    typedef struct {
        QNode *front,*rear;
    }LQueue;
    
    LQueue *q;
    
    
    
    LQueue *Init_LQueue()
    {
        LQueue *q;
        QNode *p;
        q=new LQueue;
        p=new QNode;
        p->next=NULL;
        q->front=q->rear=p;
        return q;
    }
    
    void In_LQueue(LQueue *q,DataType x)
    {
        QNode *p;
        p=new QNode;
        p->data=x;
        p->next=NULL;
        q->rear->next=p;
        q->rear=p;
    }
    
    int Out_LQueue(LQueue *q,DataType x)
    {
        QNode *p;
        if(Empty_LQueue(q))
            return 0;
        else
        {
            p=q->front->next;
            q->front->next=p->next;
            x=p->data;
            delete p;
            if(q->front->next==NULL)
                q->rear=q->front;
            return 1;
        }
    }
    
    int Empty_LQueue(LQueue *q)
    {
        if(q->front==q->rear)
            return 1;
        else 
            return 0;
    }
      
    

      

  • 相关阅读:
    大杂烩 -- 查找单向链表倒数第m个元素
    大杂烩 -- 单向链表是否存在环或是否相交
    大杂烩 -- 四种生成和解析XML文档的方法详解
    延伸 -- 泛型 -- 通配符的使用
    延伸 -- 泛型 -- 泛型的内部原理:类型擦除以及类型擦除带来的问题
    延伸 -- 泛型 -- 泛型的基本介绍和使用
    大杂烩 -- HashMap、HashTable、ConCurrentHashMap 联系与区别
    大杂烩 -- ArrayList的动态增长 源码分析
    Java -- 异常的捕获及处理 -- 自定义异常类
    Java字符串占位符(commons-text)替换(转载)
  • 原文地址:https://www.cnblogs.com/SqLver/p/4915384.html
Copyright © 2011-2022 走看看