03数据结构——栈、队列和数组
1.栈的顺序存储结构
1.1顺序栈的实现
(Ⅰ)栈的顺序存储类型
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放栈中元素
int top; //栈顶指针
}SqStack;
1.2顺序栈的基本运算

(Ⅰ)初始化
void InitStack(SqStack &S){
s.top=-1; //初始化栈顶指针
}
(Ⅱ)判栈空
bool StackEmpty(SqStack S){
if(s.top=-1) //栈空
return true;
else //不空
return false;
}
(Ⅲ)进栈
bool push(SqStack &S,ElemType e){
if(S.top==MaxSize-1) //栈满,报错
return false;
S.data[++S.top]=x; //指针先加1,再入栈
return true;
}
(Ⅳ)出栈
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1) //栈空,报错
return false;
x=S.data[S.top--] //先出栈,指针再减1
return true;
}
(Ⅴ)读栈顶元素
bool GetTop(SqStack S,ElemType &x){
if(S.top==-1) //栈空,报错
return false;
x=S.data[S.top]; //x记录栈顶元素
return true;
}
1.3共享栈

2.栈的链式存储结构
(Ⅰ)栈的链式存储类型

typedef struct Linknode{
ElemType data; //数据域
struct Linknode *next; //指针域
}LiStack;
3.队列的顺序存储结构
3.1队列的顺序存储
(Ⅰ)队列的顺序存储类型

#define MaxSize 50 //定义队列中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放队列元素
int front,rear; //队头指针和队尾指针
}SqQueue;
3.2循环队列的操作

(Ⅰ)初始化
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0; //初始化队首、队尾指针
}
(Ⅱ)判队空
bool isEmpty(SqQueue Q){
if(Q.rear=Q.front) //队空条件
return ture;
else
return false;
}
(Ⅲ)入队
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front) //队满则报错
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize; //队尾指针加1取模
return true;
}
(Ⅳ)出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front) //队空则报错
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize; //队头指针加1取模(队头指针后移动)
return true;
}
4.队列的链式存储结构
4.1队列的链式存储
(Ⅰ)队列的链式存储类型

typedef struct LinkNode{ //链式队列结点
ElemType data;
Struct LinkNode *next;
}LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;
4.2链式队列的基本操作
(Ⅰ)初始化
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode)); //建立头结点
Q.front->next=NULL; //初始为空
}
(Ⅱ)判队空
bool IsEmpty(LinkQueue Q){
if(Q.front==Q.rear)
return true;
else
return false;
}
(Ⅲ)入队
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;s->next=NULL; //创建新结点,插入到链尾
Q.rear->next=s;
Q.rear=s;
}
(Ⅳ)出队
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear) //空队
return false;
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front; //若原队列中只有一个结点,删除后变空
free(p);
reurn true;
}
5.双端队列
(Ⅰ)双端队列

(Ⅱ)输出受限的双端队列

(Ⅲ)输入受限的双端队列


浙公网安备 33010602011771号