計算機考研之數據結構-棧與隊列

數據結構-棧與隊列

定義

一類操做受限的線性表。指針

  • :只容許在一端進行插入或者刪除操做的線性表。
  • 棧頂:運行刪除與插入的那一端。
  • 棧底:不容許刪除和插入的另外一端。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;
}

小結

習題

相關文章
相關標籤/搜索