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.双端队列

(Ⅰ)双端队列

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

 

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

posted @ 2023-10-09 10:38  freshman_xy  阅读(7)  评论(0)    收藏  举报  来源