计算机考研之数据结构-栈与队列

数据结构-栈与队列

定义

一类操作受限的线性表。

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

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

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

  • 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;
}

小结

习题

posted @ 2018-10-29 19:59  NeverMoes  阅读(626)  评论(0编辑  收藏  举报