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

简介: 给定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编辑

    相关文章
    |
    1月前
    |
    C语言
    【数据结构】栈和队列(c语言实现)(附源码)
    本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
    185 9
    |
    1月前
    |
    存储 算法
    非递归实现后序遍历时,如何避免栈溢出?
    后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
    32 1
    |
    23天前
    |
    存储 缓存 算法
    在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
    在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
    44 5
    |
    1月前
    |
    存储 算法 Java
    数据结构的栈
    栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
    |
    1月前
    |
    算法 调度
    基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
    车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
    |
    1月前
    |
    存储 JavaScript 前端开发
    执行上下文和执行栈
    执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
    |
    1月前
    |
    存储
    系统调用处理程序在内核栈中保存了哪些上下文信息?
    【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
    51 4
    |
    1月前
    |
    算法 安全 NoSQL
    2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
    数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
    |
    1月前
    |
    算法
    数据结构之购物车系统(链表和栈)
    本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
    48 0
    |
    17天前
    |
    算法
    基于WOA算法的SVDD参数寻优matlab仿真
    该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
    下一篇
    DataWorks