数据结构与算法——栈作业

简介: 给定n个元素的集合S,依次入栈,问:1)有多少种合法的出栈序列?卡特兰数2)分别是什么?编程3)如果给出一个另一个由S中所有元素不重复组成的序列q,如何判断q是一个合法的出栈序列。编程题4)如果S={1,2,3,4,5,6},入栈顺序是1,2,3,4,5,现在知道出栈序列q的前两个元素依次是,2, 4则第三个元素有几种可能?分别是什么? 自己想,如何编程实现

 给定n个元素的集合S,依次入栈,问:

1)有多少种合法的出栈序列?卡特兰数

2)分别是什么?编程

3)如果给出一个另一个由S中所有元素不重复组成的序列q,如何判断q是一个合法的出栈序列。编程题

4)如果S={1,2,3,4,5,6},入栈顺序是12345,现在知道出栈序列q的前两个元素依次是,2 4则第三个元素有几种可能?分别是什么?自己想,如何编程实现

    1. 若第一个出栈的序数是k,则分为二个序列,第一个序列的个数为k-1,第二个序列的个数为n-k,所以f(n)就可以等价于k-1的出栈序列种数乘以序列个数为n-k的出栈序列种数,f(n)=f(k-1)*f(n-k),k可以取1~n,所以f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0),另f(0)=1,f(1)=1,则给定n个元素,合法的出栈序列的种数有:C(2n,n)-C(2n,n+1)

    2.

    #include <iostream>

    #include <stack>

    #include <queue>

    #include <algorithm>

    #include <string.h>

    #include <cstdio>

    #include <stdlib.h>

    #include <cctype>

    #include <stack>

    #include <queue>

    using namespace std;

    void printAllOutStackSeq( queue<int> inQueue, int n, stack<int> st, queue<int> out )

    {

          if( n <= 0 || ( inQueue.empty() && st.empty() && out.empty() ) )

          {

                 return;

          }

          if( out.size() == n )

          {

                 while( !out.empty() )

                 {

                        cout << out.front() << ' ';

                        out.pop();

                 }

     

                 cout << endl;

                 return;

          }

          stack<int> stCopy = st;  // 备份一下,否则储转

          queue<int> outCopy = out;

          if( !st.empty() ) // 出栈,将元素出栈,push到结果队列中

          {

                 out.push( st.top() );//取出栈顶元素,放到队列out中

                 st.pop();//弹出栈顶元素

                 printAllOutStackSeq( inQueue, n, st, out );    

          }

          if( !inQueue.empty() ) // 入栈,将输入队列出队,进行入栈

          {

                 stCopy.push( inQueue.front() );//将inQueue队列的第一个元素放到栈stCpoy中

                 inQueue.pop();//弹出队列的第一个元素

                 printAllOutStackSeq( inQueue, n, stCopy, outCopy );

          }

          return;

    }

    int main()

    {      

          int k,i;

          cout<<"请输入入栈的元素个数"<<endl;

          cin>>k;

          int a[k];

          cout<<"请输入"<<k<<"个元素" <<endl;

          for(i=0;i<k;i++)

                 cin>>a[i];

          queue<int> inQueue;

          for( int j = 0; j < k; j++ )

          {

                 inQueue.push( a[j] );

          }

          int n;

          stack<int> st;

          queue<int> out;

          cout<<"出栈顺序有:"<<endl;

          printAllOutStackSeq( inQueue, k, st, out );

          return 0;

    }

    image.gif编辑image.gif编辑

    3.

    #include <iostream>

    #include <string>

    //12345

    //10324

    using namespace std;

    int main(){

    while(true){

          string s1,s2;

          cout<<"请输入入栈顺序"<<endl;

          cin>>s1;

          cout<<"请输入出栈顺序"<<endl;

          cin>>s2;

          int n=s1.size();

          int a[n];

          int i,j,k;

          int min;

          int number1,number2=1;

          for(i=0;i<n;i++){

                 a[i]=s1.find(s2[i]);

                 //cout<<a[i]<<endl;

          }

          for(i=0;i<n;i++){

                 min=a[i];

                 for(j=i+1;j<n;j++)

                 {

                        if(a[j]<a[i])

                        {

                               min=a[j];

                               number1=1;

                               break;

                        }

                 }

                 number2=1;

                 if(number1==1)

                 {

                        for(k=j+1;k<n;k++)

                        {

                               if(a[k]<a[i])

                               {

                                      if(a[k]<min)

                                             min=a[k];

                                      else

                                      {

                                             number2=0;

                                             break;

                                      }

                               }

                        }

                 }

                 if(number2==0)

                 {

                        cout<<"该出栈顺序是错误的"<<endl<<endl;

                        break;

                 }            

          }

          if(number2==1)

          cout<<"该出栈顺序是正确的"<<endl<<endl;

    }

          return 0;

    }

    image.gif编辑

    4. 如果入栈顺序为1,2,3,4,5,出栈顺序的前二个为2,4,此时比2小的只有1,比4小的数有1和3,那么出栈顺序规律中,每一个元素的后面比自己小的数,出栈顺序必须是降序排列,那么1肯定在3的后面,而5的位置可以随便出,所以2,4先出栈时,只有三种情况(2,4,3,5,1)(2,4,5,3,1) (2,4,3,1,5),则第三个元素只有2中可能,只有3或者5。

    #include <iostream>

    #include <stack>

    #include <queue>

    #include <algorithm>

    #include <string.h>

    #include <cstdio>

    #include <stdlib.h>

    #include <cctype>

    #include <stack>

    #include <queue>

    using namespace std;

    void printAllOutStackSeq( queue<int> inQueue, int n, stack<int> st, queue<int> out )

    {

       int b[n];

       int h=0,t=0;

       if( n <= 0 || ( inQueue.empty() && st.empty() && out.empty() ) )

       {

          return;

       }

       if( out.size() == n )

       {

          while( !out.empty() )

          {

                 b[h]=out.front();

                 //cout << out.front() << ' ';

                 out.pop();

                 h++;

                 //cout<<b[h-1] ;

          }

          if(b[0]==2&&b[1]==4){

                 cout<<"出栈顺序的前二个元素为2,4,则出栈的第三个元素为:"<<b[2]<<endl;

          }

          //cout<<"宁";

          //cout << endl;

          return;

       }

       stack<int> stCopy = st;  // 备份一下,否则储转

       queue<int> outCopy = out;

       if( !st.empty() ) // 出栈,将元素出栈,push到结果队列中

       {

          out.push( st.top() );//取出栈顶元素,放到队列out中

          st.pop();//弹出栈顶元素

          printAllOutStackSeq( inQueue, n, st, out );

       }

       if( !inQueue.empty() ) // 入栈,将输入队列出队,进行入栈

       {

          stCopy.push( inQueue.front() );//将inQueue队列的第一个元素放到栈stCpoy中

          inQueue.pop();//弹出队列的第一个元素

          printAllOutStackSeq( inQueue, n, stCopy, outCopy );    

       }

       return;

    }

    int main()

    {  

       int k,i;

       cout<<"请输入入栈的元素个数"<<endl;

       cin>>k;

       int a[k];

       cout<<"请输入"<<k<<"个元素" <<endl;

       for(i=0;i<k;i++)

          cin>>a[i];

       queue<int> inQueue;

       for( int j = 0; j < k; j++ )

       {

          inQueue.push( a[j] );

       }

       int n;

       stack<int> st;

       queue<int> out;

       //cout<<"出栈顺序有:"<<endl;

       printAllOutStackSeq( inQueue, k, st, out );

       return 0;

    }

    image.gif编辑

    相关文章
    |
    3月前
    |
    存储 算法
    非递归实现后序遍历时,如何避免栈溢出?
    后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
    53 1
    |
    1月前
    |
    存储 C语言 C++
    【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
    本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
    142 77
    |
    2天前
    |
    DataX
    ☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
    ### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
    |
    1月前
    |
    存储 C++ 索引
    【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
    【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
    43 13
    【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
    |
    1月前
    |
    存储 C语言 C++
    【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
    本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
    46 9
    |
    1月前
    |
    C++
    【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
    【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
    38 7
    |
    2月前
    |
    算法
    【算法】栈
    栈相关算法题,供参考,附有链接地址及板书
    |
    3月前
    |
    存储 缓存 算法
    在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
    在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
    99 5
    |
    3月前
    |
    存储 算法 Java
    数据结构的栈
    栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
    116 21
    |
    3月前
    |
    算法 调度
    基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
    车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。

    热门文章

    最新文章

  1. 1
    局域网屏幕监控系统中的Python数据结构与算法实现
    132
  2. 2
    2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
    47
  3. 3
    2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    45
  4. 4
    2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    50
  5. 5
    2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    52
  6. 6
    2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    39
  7. 7
    2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    71
  8. 8
    2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    37
  9. 9
    2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    45
  10. 10
    2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    43