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

数据结构-栈与队列

定义

一类操做受限的线性表。指针

  • :只容许在一端进行插入或者删除操做的线性表。
  • 栈顶:运行删除与插入的那一端。
  • 栈底:不容许删除和插入的另外一端。code

  • InitStack(&S),初始化。
  • StackEmpty,判空。
  • Push(&S, x),进栈。
  • Pop(&S, &x),出栈。
  • GetTop(S, &x),得到栈顶元素,可是不出栈。队列

存储结构

顺序存储
定义it

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

操做:class

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),出队。next

存储

顺序存储数据

定义

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

小结

习题

相关文章
相关标签/搜索