数据结构TASK1

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 

猜你喜欢

转载自blog.csdn.net/xiu351084315/article/details/89111000