ds:顺序表实现栈、队列的思想

 

写在前边:栈、队列都是线性表,都可以用顺序表、单链表实现。 

 

一、顺序表实现栈:

1.入栈时需要判断栈满、出栈时需要判断栈空(链栈不需要处理这一点)

2.根据init()时s.top栈顶指针等于1、等于0的不同,在入栈、出栈时对于“元素操作、栈顶指针移动”的操作顺序也不同(链栈不需要处理这一点)

 

 

 

二、顺序表实现队列:

1.基本的实现方式:定义一个顺序表和表头指针front、表尾指针rear,front、rear初始化时都指向0;需要使用%maxsize取模运算来将队列变成循环队列

2.基本的实现方式是要用rear指针指向下一个存储元素的位置,会始终占用一个位置。为了避免这种情况,需要定义一个size来存储队列内的元素数量、或者定义tag操作来表示当前是进行插入、删除操作:只有插入会导致队满,只有删除会导致队空,使用tag时对队满、队空的判断也不一样了,需要(Q.rear == Q.front && tag = 0)这样两个条件一起判断

方法一:

>>>队满:(Q.rear+1)%maxsize == Q.front

>>>队空:Q.rear == Q.front

// 顺序表实现的序列-方式一:使用maxsize的一个存储空间来存储rear(rear指向的是下一个待插入元素的位置)
#define maxsize 10
typedef struct{
    int data[maxsize];
    int front,rear;
}sqQueue;

bool init(sqQueue &Q){
    for(int i = 0;i<maxsize;i++){
        Q.data[i] = -1;
    }
    Q.front = Q.rear = 0;
    return true;
}

bool isEmpty(sqQueue Q){
    if(Q.front == Q.rear){
        return true;
    }else{
        return false;
    }
}

方法二:

>>>队满:Q.size == maxsize

>>>队空:Q.size == 0

//顺序表实现的队列-避免rear存储空间浪费:方式一:用size表示当前队列元素数量
#define maxsize 10
typedef struct{
    int data[maxsize];
    int front,rear;
    int size;   // 队列的容量
}sqQueue;

bool init(sqQueue &Q){
    Q.front = Q.rear = 0;
    for(int i = 0;i<maxsize;i++){
        Q.data[i] = -1;
    }
    Q.size = 0;
    return true;
}

bool isEmpty(sqQueue Q){
    if(Q.size == 0){
        return true;
    }else{
        return false;
    }
}

方法三:

>>>队满:Q.front == Q.rear && Q.tag == 1

>>>队空:Q.front == Q.rear && Q.tag == 0

//顺序表实现的队列-避免rear存储空间浪费:方式一:用tag表示插入、删除操作,只有插入能导致队满,只有删除能导致队空
#define maxsize 10
typedef struct{
    int data[maxsize];
    int front,rear;
    int tag;        // 用来标记插入/删除操作,插入时tag=0,删除时tag=1
}sqQueue;

bool init(sqQueue &Q){
    for(int i =0;i<maxsize;i++){
        Q.data[i] = -1;
    }
    Q.front = Q.rear = 0;
    Q.tag = 0;
    return true;
}

bool empty(sqQueue Q){
    if((Q.front == Q.rear) && (Q.tag == 0)){
        return true;
    }else{
        return false;
    }
}

 

posted @ 2023-05-11 11:24  _titleInfo  阅读(26)  评论(0编辑  收藏  举报
//雪花飘落效果