补基础-队列与栈
前言
本次作业要求学习有关数据结构栈的知识,正好借此机会开始弥补我薄弱的基础。本次复习队列和栈。
PS:经过学习后,基本的思路和原理大致是了解了,但是有关实现方面的,基本上还什么都不知道,了解了一部分的实现以及通过调用标准库的用法。
栈
定义
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行,即后进先出(Last In First Out),简称为LIFO线性表。
一般可以对栈进行以下五种操作:
- 构造空栈:InitStacks(S)
- 判断空栈:isEmpty(S)
- 进栈:Push(S,x)
- 退栈:Pop(S)
- 取栈顶元素:Top(S)
栈的顺序储存
#include <iostream>
using namespace std;
#define MAX 10
class stack
{
private:
int arr[MAX];
int top;
public:
stack()
{
InitStack();
}
/************************************************************************/
/* 初始化栈 */
/************************************************************************/
void InitStack()
{
top=-1;
}
/************************************************************************/
/* 入栈 */
/************************************************************************/
void push(int a)
{
top++;
if(top < MAX) {
arr[top]=a;
} else {
cout<<"STACK FULL!!"<<top;
}
}
/************************************************************************/
/* 出栈 */
/************************************************************************/
int pop()
{
if(isEmpty()) {
cout<<"STACK IS EMPTY ";
return 0;
} else {
int data=arr[top];
arr[top]=0;
top--;
return data;
}
}
/************************************************************************/
/* 是否为空 */
/************************************************************************/
bool isEmpty()
{
if(top == -1) return true;
else return false;
}
};
int main()
{
stack a;
a.push(1);
cout<<"Pop:"<<a.pop();
return 0;
}
栈的链式储存
这个等我复习完动态分配内存、动态链表等的相关知识后再来看。
C++标准库的实现
先包含相应的头文件:
#include<stack>
定义栈:
stack
s.empty() //如果栈为空返回true,否则返回false
s.size() //返回栈中元素的个数
s.pop() //删除栈顶元素但不返回其值
s.top() //返回栈顶的元素,但不删除该元素
s.push() //在栈顶压入新元素
队列
定义
队列也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队头,允许插入的一端称为队尾,队列的操作原则是先进先出的(First In First Out),所以队列又称作FIFO表。
队列一般有以下操作:
- 构造空队:InitQueue(Q)
- 判队空:isEmpty(Q)
- 入队:EnQueue(Q,x)
- 出队:DeQueue(Q)
- 取队头元素:Front(Q) 队头元素仍然保留。
- 队列长度:Size(Q)
队列的顺序储存
为了防止假溢出,一般使用循环队列,嗯。。。没懂。。
队列的链式储存
挖坑。。
C++标准库的实现
先包含相应的头文件:
#include<queue>
定义栈:
queue
q.empty() //如果队列为空返回true,否则返回false
q.size() //返回队列中元素的个数
q.pop() //删除队列首元素但不返回其值
q.front() //返回队首元素的值,但不删除该元素
q.push() //在队尾压入新元素
q.back() //返回队列尾元素的值,但不删除该元素
后记
其实这次的博客,与其说是作业,不如说是写给自己看的。一方面,这么不完全的博客说是作业好像不太说得过去,挖了无数坑,而且有关另一半的作业代码也没有提交。。另一方面,我本来就有补漏然后用博客记录的打算,这次总算是开始实行了吧。这次作业中,对我而言至少学到了队列和栈具体在应用中该如何引用,以前我是知道大概思路原理,但一直不知道是通过类来实现的,也不知道C++标准库的调用方法,现在总算是学到了。