1.栈
//C++实现栈
(1)用数组实现一个顺序栈
//栈的顺序存储结构需要通过一个数组和一个整型变量实现,
//其中,数组存放顺序栈中的每个元素;整型变量存储栈顶位置(即栈顶元素的下表位置(是否也叫栈顶指针位置?))
//栈数组:stack[n]
// 栈顶位置指针变量:top
#include<iostream>
#include<stdlib.h>
typedef int ElemType; //定义ElemType为int类型
//动态分配存储栈的数组存储空间
struct Stack{
ElemType *stack; // 存栈元素;表示stack[n]是数据元素类型 ElemType
int top; //top=-1表示栈为空,每次进栈一个数,top+1;栈顶弹出一个元素,top-1;
//总之,top指向的总是栈顶元素的位置。
int n;//定义栈stack的数组长度
};
#include"StackOperation.cpp"
//顺序栈的运算
int main()
{
Stack s;
InitStack(s);
int a[5]=[1,3,5,7,9];
int i;
for(i=0;i<4;i++) Push(s,a[i]);
cout<<Pop(s);cout<< ' '<<Pop(s)<<endl;
Push(68) ;
cout<<Peak(s);cout<<' '<<Pop(s)<<endl;
while(!EmptyStack) cout<<Pop(s)<<' ';
ClearStack(s);
return 0;
}
void InitStack(stack&S)
{
S.n=10;
S.stack=new ElemType[S.n];
if(!S.stack)
{
cerr<<"栈的动态内存分配失败"<<endl;
exit(1);
}
//初始栈为空;
S.top=-1;
}
//进栈
void Push(Stack &S, ElemType item)
{
if (S.top=S.n-1)
{
int k=sizeof(ElemType);
S.stack= (ElemType*) realloc (S.stack,2*S.n)
S.n=2*S.n;
}
S.top++;
S.stack[S.top]=item;
}
//出栈,删除栈顶元素并返回;
ElemType Pop(Stack &S)
{
if(S.top==-1)
{cerr<<"栈为空栈"<<endl;
exit(1);
}
S.top--;
return S.stack[S.top--];
}
//读取栈顶元素值
ElemType Peek(Stack &S)
{
if(S.top==-1)
{
cerr<<"Stack is empty!"<<endl;
exit(1);
}
return S.stack[S.top];
}
//判断栈是否为空
bool EmptyStack(Stack &S)
{
return S.top==-1;
}
//清空栈
void ClearStack(Stack &S)
{
if(S.stack)
{
delete S.stack[];
S.stack=0;
}
S.top=-1;
S.n=0;
(2)C++用链表实现一个链式栈
栈的链式存储结构,简称链栈。
由于栈只是栈顶在做插入和删除操作,所以栈顶应该放在单链表的头部。另外,都有了栈顶在头部了,单链表中的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。
对于链栈来说,基本不存在栈满的情况,除非内存已经没有使用空间了。
对于空栈来说,链表原来的定义是头指针指向空,那么链栈的空其实就是top=NULL。
当单链表限定只能在头部进行插入和删除操作的时候,即为链栈,一般我们会将单链表的头指针和栈的栈顶指针top合二为一,通常对链栈来说,是不需要头节点的,因为我们维护了栈顶指针。
链栈的实现:https://blog.csdn.net/jnu_simba/article/details/8840217
https://blog.csdn.net/leikun153/article/details/81180850
(3)编程模拟实现一个浏览器的前进后退功能
我们使用两个栈X和Y,我们把首次浏览的页面依次压如栈X,当点击后退按钮时,再依次从栈X中出栈,并将出栈的数据一次放入Y栈。当点击前进按钮时,我们依次从栈Y中取出数据,放入栈X中。当栈X中没有数据时,说明没有页面可以继续后退浏览了。当Y栈没有数据,那就说明没有页面可以点击前进浏览了。
注:栈的综合知识分析和应用这里很,后期需要多多复习回顾【文:栈:如何实现浏览器的前进后退功能】https://blog.csdn.net/gx17864373822/article/details/83005539
2、队列
(1)用数组实现一个顺序队列
用数组实现一个顺序队列需要设置1个数组和3个整型变量:
数组存储顺序队列中的每个元素;
3个整型变量:一个队首指针用来存队首元素的位置(而且通常存储队首元素的前一个位置);一个队尾指针存队尾元素的位置;一个存队列长度。
队列的顺序存储:https://blog.csdn.net/fanyun_01/article/details/77618472
(2)用链表实现一个链式队列
队列是一种线性结构,和链表不同之处在于队列有两个指针操作,一个是队首指针,一个是队尾指针,节点删除移动队首指针,节点插入移动队尾指针,同时队列具有先进先出的特点,
https://blog.csdn.net/lfeng_coding/article/details/47614765
(3)实现一个循环队列
把存储队列元素的表从逻辑上看成一个环,陈伟循环队列
初始时:front=rear=0
队首指针进1(进队):front=(front+1)%Maxsize
队尾指针进1(出队):rear = (rear+1)%Maxsize
队列长度:(rear+Maxsie-front)%Maxsie
出队进队时:指针都是按顺时针方向进1
实现方法:https://blog.csdn.net/Trista2hong/article/details/84033847
链表
(1)实现单链表、循环链表、双向链表,支持增删操作
单链表的插入和删除:https://blog.csdn.net/tianzhaixing2013/article/details/22717581
循环链表插入和删除:https://blog.csdn.net/fisherwan/article/details/25561857
双向链表插入和删除:https://blog.csdn.net/fisherwan/article/details/25649073
(2)实现单链表反转
就是给一个链表,求出反转后的链表,比如1 2 3 4 5反转后为5 4 3 2 1.
链表的基础定义及实现参考博文:http://blog.csdn.net/dawn_after_dark/article/details/73610674
下面的解决方法都是基于此类进行解决的。
https://blog.csdn.net/dawn_after_dark/article/details/73647844
(3)实现两个有序的链表合并为一个有序链表
https://blog.csdn.net/Lv_Victor/article/details/52464373
(4)实现求链表的中间结点
https://blog.csdn.net/zx2015216856/article/details/81811251
本文参考链接及学习资料:
https://blog.csdn.net/jnu_simba/article/details/8840217
栈:如何实现浏览器的前进后退功能https://blog.csdn.net/gx17864373822/article/details/83005539
https://blog.csdn.net/Trista2hong/article/details/84033847