栈、队列和数组
stack
顺序栈
利用数组,进行栈的操作
(待补充
链式栈
利用链表,进行栈的操作,基本不用担心栈溢出。但是需要手动释放结点内存。
这里用进栈用头插法。
(待补充
queue
顺序队列
使用数组实现,有假溢出的情况,空间利用率低。
循环队列
解决了假溢出,空出一个空间判断队列是否已满。
#include <iostream>
using namespace std;
class queue{
public:
int *q,qSize;
//尾指针,头指针
int top{0},end{0};
//初始化队列长度
queue(int qSize){
this->qSize = qSize;
q = new int[qSize];
}
int front(){
return q[top];
}
int pop(){
if(isEmpty()){
cerr << "Empty queue" << endl;
return -1;
}
int ans = q[top];
top= (top+1)%qSize;
return ans;
}
void push(int i){
if(isOversize()){
cerr << "Oh! my size is max."<<endl;
return ;
}
q[end] = i;
end = (end+1)%qSize;
}
bool isEmpty(){
return top==end;
}
//end+1是否等于top
bool isOversize(){
if((end+1)%qSize==top)return true;
return false;
}
};
int main()
{
queue myQueue(5);
//5个存储空间最多只能放4个数,所以会overSize提醒
for(int i=0;i<5;i++){
myQueue.push(i+10);
}
cout<<myQueue.front()<<endl;
myQueue.pop();
cout<<myQueue.front()<<endl;
myQueue.pop();
cout<<myQueue.front()<<endl;
myQueue.push(521);
myQueue.push(1314);
cout<<myQueue.front()<<endl;
myQueue.pop();
cout<<myQueue.front()<<endl;
myQueue.pop();
cout<<myQueue.front()<<endl;
myQueue.pop();
cout<<myQueue.front()<<endl;
return 0;
}
链队
用链表实现队列,不用担心队列长度是否已满。
#include <iostream>
using namespace std;
class node {
public:
int val{0};
node* next = nullptr;
node() = default;
node(int val) : val(val){
}
node(int val,node* next) : val(val), next(next){}
};
class queue{
public:
node * head = new node;
node* front = head;
node* end = head;
queue() = default;
void push(int x){
node * temp = new node(x);
end->next = temp;
end = end->next;
}
// 只需front的next只需下一个的下一个
void pop(){
if(isEmpty()){
clog<<"Empty queue"<<endl;
return ;
}
node* t = front->next;
front->next = t->next;
//如果只有一个结点,要把end=front
if(t==end){
end = front;
}
delete t;
}
int top(){
if(isEmpty()){
clog<<"Empty queue"<<endl;
return -1;
}
return front->next->val;
}
bool isEmpty(){
return front==end;
}
void destroy(){
node* t ;
while(front->next!=nullptr){
t = front->next;
front->next = t->next;
delete t;
}
end = front;
}
};
int main()
{
queue me;
me.pop();
me.push(1213);
me.push(429);
cout<<me.top()<<endl;
me.pop();
cout<<me.top()<<endl;
me.push(1213);
me.push(429);
me.push(1213);
me.push(429);
me.destroy();
me.pop();
cout<<me.top()<<endl;
return 0;
}