一類操做受限的線性表。指針
棧底:不容許刪除和插入的另外一端。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; }