一类操做受限的线性表。指针
栈底:不容许删除和插入的另外一端。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; }