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; } }