【数据结构】若元素以a,b,c,d,e的顺序进入一个初始为空的栈中,每个元素进栈,出栈各一次,要求出栈的第以元素为d,则合法的出栈序列共有多少种?

题目:

若元素以a,b,c,d,e的顺序进入一个初始为空的栈中,每个元素进栈,出栈各一次,要求

出栈的第以元素为d,则合法的出栈序列共有多少种?

答:

首先他是以a,b,c,d,e,的顺序入栈

题目要求第一个出栈的是d,所以只能abcd入栈,这样栈中还有abc3种元素

e还没有入栈,e可以有4个时机入栈,即合法的出栈顺序是decba,dceba,

dcbea,dcbae.

如果不是指定的顺序入栈,出栈还是b的话,那么合法的出栈顺序有24种

abc有6种排序,e有4个时机入栈,所以总共有24种合法的出栈顺序

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【问题描述】 客户业务分为两。第一是申请从银行得到一笔资金,即取款或借款。第二是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二业务的客户,则顺序检查和处理(如果可能)第二个队列的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程,一旦银行资金总额少于或等于刚才第一个队列最后一个客户(第二业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。 写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。 【基本要求】 利用动态存储结构实现模拟。 【测试数据】 一天营业开始时银行拥有的款额为10000(元),营业时间为600(分钟)。其他模拟参 量自定,注意测定两极端的情况:一是两个到达事件之间的间隔时间很短,而客户的交易时间很长,另一个恰好相反,设置两个到达事件的间隔时间很长,而客户的交易时间很短。 【实现提示】 事件有两类:到达银行和离开银行。初始时银行现存资金总额为total。开始营业后的第一今事件是客户到达,营业时间从0到closetime。到达事件发生时随机地设置此客户的交易时间和距下一到达事件之间的时间间隔。每个客户要办理的款额也是随机确定的,用负值和正值分别表示第一类和第二类业务。变量total,closetime以及上述两个随机量的上下界均交互地从终端读入,作为模拟参数。 两个队列和一个事件表均要用动态存储结构实现。注意弄清应该在什么条件下设置离开事件,以及第二个队列用怎样的存储结构实现时可以获得较高的效率。注意:事件表是按时间顺序有序的。 【选作内容】 自己实现动态数据类型。例如对于客户结点,定义pool为 CustNodepoolfMAX]; // 结构类型CustNode含四个域:aITHIne,durtime,amount,next 或者定义四个同样长的,以上述域名为名字的数组。初始时,将所有分量的next域链接起来,形成一个静态链找,设置一个楼顶元素下标指示量top,top=0表示找空。动态存储分配函数可以取名为myMalloc,其作用是出钱,将钱顶元素的 下标返回。若返回的值为0,则表示无空间可分配。归还函数可取名为myFree,其作用是把该分量入钱。用FOR-TRAN和BASIC等语言实现时只能如此地自行组织。 自己手写的数据结构作业,选做部分也实现。
数据结构及算法C语言版。严蔚敏版。VC6运行通过,这个是源代码CPP文件,包含顺序线性表、单链表的插入、删除、查找。包含监视哨查找,折半查找,直接插入排序,希尔排序,冒泡排序,快速排序,选择排序。里面包含超大量的注释,包括对VC6的语法解释和算法的解释和理解。具体效果可以看 http://download.csdn.net/detail/changechange/8236207 我上次上传的 EXE demo,带输入输出,能与用户交互。在运行的时候会把整个运算的过程都显示出来。摘录代码如下://数据结构 上机第一次 应用,转换进制题目。 //请用每一个cpp作为一个项目,不要把多个cpp放到同一个项目,因为我为每个cpp都定义了main。 //这个教材上没有,只能自己补全了 #include using namespace std; //p10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; //下面这行书上没找到,自己补的。 typedef int SElemType; //p46书上的。 #define STACK_INIT_SIZE 100 //定义最初申请的内存的大小 #define STACKINCREMENT 10 //每一次申请内存不足的时候扩展的大小 typedef struct { SElemType *base; //在构造之前和销毁之后,base的值为null SElemType *top; //顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack; //定义顺序别名。 //构造一个S Status InitStack(SqStack &S) { // 参考之前的 List.cpp队malloc的解释。 S.base=(SElemType *) malloc(STACK_INIT_SIZE * sizeof (SElemType)); if (!S.base) exit(OVERFLOW); // 存储分配失败 S.top = S.base; //初始顶等于低 S.stacksize = STACK_INIT_SIZE; //初始容量 return OK; } //end of InitStack //插入元素e为新的元素 Status Push(SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize) // 满,追加存储空间 { S.base = (SElemType *) realloc(S.base, //原底指针 (S.stacksize + STACKINCREMENT) * sizeof (SElemType)); //新大小 if (!S.base) exit(OVERFLOW); // 存储分配失败 //调整顶的位置 S.top = S.base + S.stacksize; //修改大小为新的大小 S.stacksize += STACKINCREMENT; } //*符号为求值符。 *S.top++ = e; //先把e压入栈顶,S.top再增1指向元素e的下一个位置 return OK; } //end of Push // 若不空,则删除S的元素,用e返回其值,并返回OK;否则返回ERROR Status Pop(SqStack &S, SElemType &e) { if (S.top == S.base) //顶=底表示空,如果空,报错 return ERROR; e = *--S.top; //S.top先减1指向元素,再取值,赋值给e用于返回。 return OK; } //这个书上没有,自己加的 //书上没有,自己写的,用来处理每一个元素的data Status PrintEach(SElemType e){ cout<<e<<";"; return OK; } //从底依次对个元素调用函数visit(),主要用于输出 //关于visit的解释参考 List.cpp Status StackTraverse(SqStack &S,Status(* visit)(SElemType)){ int l = S.top-S.base; S.top=S.base; //从底开始输出 for(int i=0;i<l;i++) //用长度控制输出的个数 { (* visit)(*(S.top)++); } return OK; } // 若S为空,则返回TRUE,否则返回FALSE Status StackEmpty(SqStack &S) { //顶指针S.top是否等于底指针S.base是判断是否为空的条件 if (S.top == S.base) return TRUE; else return FALSE; } //p48 进行进制转换 //对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 void conversion() // 算法3.1 { SqStack S; //声明顺序S unsigned int N; //unsigned 表示无符号,unsigned int 从0开始,非负整数 SElemType e; //元素e InitStack(S); //构造空S cout<=0)"<<endl; scanf("%d",&N); //获取用户的输入,%d 是对数据的格式化。 &N 表示对变量 N 引用。 while (N) //只要n不等于0就循环。从n为用户输入的十进制数开始,一直到n等于0为止 { Push(S, N % 8); //n除以8的余数(8进制的低位)入栈 //先压入的余数是八进制的低位,后压入的余数是八进制的高位 N = N / 8; //令n等于n整除以8的商,进入下轮循环 } //我自己加的,先输出一遍内的内容。 cout<<"从底到顶输出栈内的内容,用于调试:"; StackTraverse(S,PrintEach); cout<<endl; //循环结束时,n等于0 while (!StackEmpty(S)) //只要S没pop空就不断循环,直到pop出栈元素S为空为止 { Pop(S, e); //pop出栈元素且赋值给e进行返回 //先pop出的是八进制的高位,后pop出的是八进制的低位 printf("%d", e); //依次输出e } //循环结束时,S为空 cout<<endl; } int main() { for(int i=0;i<4;++i) conversion(); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值