数据结构-栈与队列
栈
定义
一类操作受限的线性表。
-
栈:只允许在一端进行插入或者删除操作的线性表。
-
栈顶:运行删除与插入的那一端。
-
栈底:不允许删除和插入的另一端。
-
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;
}