队列

2023-09-18   


队列结构定义

#define MaxSize 100
typedef struct {
	int data[MaxSize];
	int front, rear;	//队列头尾指针
}SqQueue;

循环队列基本操作

初始化

void initQueue(SqQueue &Q) {
	Q.rear = Q.front = 0;
}

判队列是否为空

bool isEmpty(SqQueue Q) {
	return Q.rear == Q.front ? true : false;
}

进队

bool EnQueue(SqQueue &Q, int x) {
	if ((Q.rear + 1) % MaxSize == Q.front)
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	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) % MaxSize;
}

相关题目

通过栈实现队列元素逆置

思路:
取出队列元素放入栈,全部放入之后,从栈中在放入队列中

void inverse(Stack &S, Queue &Q) {
	while(!QueueEmpty(Q)) {
		x = DeQueue(Q);
		Push(S, x);
	}
	while(!StackEmpty(S)) {
		Pop(S, x);
		EnQueue(Q, x);
	}
}

利用两个栈S1和S2来模拟队列

题意
思路:
利用栈的后进先出的特性,将元素插入至S1中,然后将S1中的插入到S2中,即S2的顺序是原来的逆序。
入队:用S1来执行入队操作,若S1已满,必须保证S2为空,才能将S1中的元素全部插入到S2中。
出队:用S2来执行出队操作,若S2为空,则先将S1中元素全部送入S2。

class CQueue {
public:

    stack<int> st1;
    stack<int> st2;

    CQueue() {
    }
    
    void appendTail(int value) {
        st1.push(value);
    }
    
    int deleteHead() {
        if(st2.empty()) {
            while(!st1.empty()) {
                st2.push(st1.top());
                st1.pop();
            }
        }
        if (st2.empty())    return -1;
        else{
            int ans = st2.top();
            st2.pop();
            return ans;
        }
    }
};

Q.E.D.