C++栈与队列

来源:互联网 发布:保利水管 知乎 编辑:程序博客网 时间:2024/06/08 15:23

栈:

   栈是一种特殊的线性表,栈的插入和删除操作只允许在表尾一端进行,因此栈是操作受限线性表。栈可以是顺序存储,也可以是链式存储。

往栈里插入一个元素称为进栈(push),从栈里删除一个元素称为出栈(pop)。同时还有一个栈顶指针(top),总是指向最后一个进栈的元素,当top=-1 时 表示栈为空,top=MaxSize-1 表示栈已满,再进行插入操作会溢出。

 

使用标准库的栈和队列时,先包含相关的头文件

#include<stack>

定义栈如下:

stack<int> stk;

栈提供了如下的操作

s.empty()               如果栈为空返回true,否则返回falses.size()                返回栈中元素的个数s.pop()                 删除栈顶元素但不返回其值s.top()                 返回栈顶的元素,但不删除该元素s.push()                在栈顶压入新元素

 

队列:

     队列也是一种操作受限的线性表,队列的插入操作只允许在表尾一端进行,而删除操作只允许在表头进行。

队列设置两个指针进行管理,一个指针是队头指针front,它指向队头元素;另一个指针是队尾指针rear,它指向下一个入队元素的存储位置。当front=rear 时,队中没有任何元素。

 

#include<queue>

定义队列如下:

queue<int> q;

q.empty()               如果队列为空返回true,否则返回falseq.size()                返回队列中元素的个数q.pop()                 删除队列首元素但不返回其值q.front()               返回队首元素的值,但不删除该元素q.push()                在队尾压入新元素q.back()                返回队列尾元素的值,但不删除该元素

 

循环队列:

  当队列为空时front=rear ,而当所有的队列空间全占满时也有front=rear 。为了区别这种情况,规定循环队列最多只能有MaxSize-1 个对列元素,当循环队列中只剩下一个空存储单元时,对列就已经满了。因此,队列判断空的条件是front=rear ,而队列判断满的条件是   front=(rear+1)%MaxSize   。

 

在STL中,对队列的使用很是较完美
下面给出循环队列的运算算法:
(1)将循环队列置为空
//将队列初始化
SeQueue::SeQueue()
{ front=0;
rear=0;
cout<<"init!"<<endl;
}
(2)判断循环队列是否为空
int SeQueue::Empty()
{ if(rear==front) return(1);
else return(0);
}
(3)在循环队列中插入新的元素x
void SeQueue::AddQ(ElemType x)
{ if((rear+1) % MAXSIZE==front) cout<<" QUEUE IS FULL! "<<endl;
else{ rear=(rear+1) % MAXSIZE;
elem[rear]=x;
cout<<" OK!";
}
}
(4)删除队列中队首元素
ElemType SeQueue::DelQ()
{ if(front==rear)
{ cout<<" QUEUE IS EMPTY! "<<endl; return -1;}
else{ front=(front+1) % MAXSIZE;
return(elem[front]);
}
}
(5)取队列中的队首元素
ElemType SeQueue::Front()
{ ElemType x;
if(front== rear)
cout<<"QUEUE IS EMPTY "<<endl;
else x= elem[(front+1)%MAXSIZE];
return (x);
}

 

0 0