Cristiano的栈和队列总结

一、栈和队列的概念
栈和队列常应用在操作系统、编译程序等各种软件系统中,是操作受限的线性表。
二、栈
2.1 栈的逻辑结构
栈是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端成为栈顶,另一端称为栈低,不含任何数据元素的栈称为空栈。
栈中的元素具有后进先出的特征,即最后入栈者最先出栈
2.2 栈的存储结构
2.2.1 栈的顺序存储结构——顺序栈
顺序栈的本质上是顺序栈的简化,唯一需要确定的是用数组的哪一段表示栈底。
一般用数组中下标为0的一端作为栈底,同时附设指针top = -1;元素入栈时top要加1,出栈时top要减1;栈满时top == MaxSize-1;top指针始终指向栈顶,即数组的最末尾的位置
2.2.2 两栈共享空间
顾名思义,即两个栈共用一个数组(数组长度足够长),且两个指针top1 =-1,top2 = MaxSize;即从两边双向添加进元素
2.2.3 栈的连接存储结构——链栈
通常链栈用单链表实现,一般采用头插法将数据元素入栈,因为这样top指针始终指向链栈的头节点,就满足后进先出的特征。
链栈不需要设置first头节点,只需要top = NULL即可,就成功创建了一个空链栈
2.2.4 链栈和顺序栈的比较
2.2.4.1 时间性能比较
两者的时间性能差不多,比较意义不大
2.2.4.2 空间性能比较
顺序栈必须确定一个固定的长度;而链栈不存在栈满的问题,但是每个节点的指针域会产生结构性开销。
因此当栈的元素个数变化较大时,使用链栈;反之使用顺序栈

三、队列
3.1 队列的逻辑结构
队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入(入队、进队)的一端称为队尾,允许删除(出队)的一端称为队头,队列中的元素具有先进先出的特点
3.2 队列的存储结构
3.2.1 队列的顺序存储结构——循环队列
循环队列与单向队列不同,单向队列是一昧的往后面添加元素,可能会出现“假溢出”的情况,使用循环队列就可以解决这种现象。
如何使得rear(front)指针指向“下一个”位置的呢?初始化一般:rear = front = 0;
只需令

rear = (rear+1)%size;
front = (front+1)%size;

即可
如何区分队列是满还是空?
我们可以浪费一个存储空间,里面的值为空,在初始化时令front指针指向它,rear指针指向它的下一个空间,这样front指针和rear指针就正好相差一。则当front == rear 时队列为空;当front == (rear+1)%size时队列已满
3.2.2 队列的连接存储结构——链式队列
链式队列是在单链表的基础上进行修改,与链栈不同的是,链式队列需要设置first头指针,再令front = rear = first指针即可。
插入时采用尾插法,删除时从头节点开始删除,满足先进先出的特征
删除时要注意队列长度等于1时的特殊情况

char LinkQuese::deQuese(){
    
    
	if(isEmpty()){
    
    
		return -1;
	}else{
    
    
		Node* p = front->next;
		char ch1 = p->data;
		front->next = p->next;
		if(p->next == NULL){
    
           //如果队列长度为1,即只含有一个元素时,
			rear = front;          //让尾指针指向front指针
		}		
		delete p;
		msize--;
		return ch1; 
	}
}

3.2.3 循环队列和链式队列的比较
3.2.3.1 时间性能比较
二者的时间性能相同
3.2.3.2 空间性能比较
当队列的元素个数变化较大时,使用链式队列;反之使用循环队列

//栈
//s.empty();         //如果栈为空则返回true, 否则返回false;
//s.size();          //返回栈中元素的个数
//s.top();           //返回栈顶元素, 但不删除该元素
//s.pop();           //弹出栈顶元素, 但不返回其值
//s.push();          //将元素压入栈顶
 
//队列
//q.empty();         //如果队列为空返回true, 否则返回false     
//q.size();          //返回队列中元素的个数
//q.front();         //返回队首元素但不删除该元素
//q.pop();           //弹出队首元素但不返回其值
//q.push();          //将元素压入队列
//q.back();          //返回队尾元素的值但不删除该元素
 
 
#include<iostream>
 
#include<stack>
#include<queue>
 
using namespace std;
 
//定义
stack<int>s;
queue<int>q;

猜你喜欢

转载自blog.csdn.net/Cristiano_san/article/details/106819759