栈1--出栈序列

栈1--出栈序列

一、心得

二、题目及分析

进栈序列是123,求所有的出栈序列

用回溯法做

三、代码及结果

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4
 5 stack<int> sta;
 6 int ans[4];
 7 int total=0;
 8
 9 void print(){
10     total++;
11     cout<<total<<": "<<endl;
12     for(int i=1;i<=3;i++){
13         cout<<ans[i]<<" ";
14     }
15     cout<<endl;
16 }
17
18 void search(int step,int n,int write){
19     if(step==7&&write==4) print();
20     else
21         for(int i=1;i<=2;i++){
22             if(i==1){//进栈操作
23                 if(n<=3){
24                     sta.push(n);
25                     search(step+1,n+1,write);
26                     sta.pop();
27                 }
28             }
29             if(i==2){
30                 if(!sta.empty()){
31                     ans[write]=sta.top();
32                     sta.pop();
33                     search(step+1,n,write+1);
34                     sta.push(ans[write]);
35                 }
36             }
37         }
38 }
39
40 int main(){
41     search(1,1,1);
42     return 0;
43 }

时间: 2024-10-08 20:43:07

栈1--出栈序列的相关文章

N个数依次入栈,出栈顺序有多少种?

对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数. 在2n位二进制数中填入n个1的方案数为C(2n,n),不填1的其余n位自动填0.从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所

C++中栈的出栈,入栈规则:A,B,C,D,E

考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CDABE   d.  DCBEA 分析: 1.假定进栈序列是从小到大排练的(即A<B<C<D<E),则出栈序列中不可能有  “大小中”这种序列,因为在“大数”出栈后,在栈中“中数”是在“小数”上面的,所以只能是先出“中数”再出“小数”2.出栈序列中如包含下列序列则是错误的:CAB,DAB

判断栈的出栈顺序合法性

栈的出栈顺序合法性是指给定一系列元素,如1 - N,按照从小到大的方式入栈,每个元素的出栈时机不定.题目给定一个出栈顺序,我们来判断这个出栈顺序有没有可能发生. 比如对[1,2,3,4,5,6,7,8,9]: [1,2,3,4,5,6,7,8,9]是一个合法出栈序列 [9,8,7,6,5,4,3,2,1]也是一个合法序列 [4,5,3,2,7,6,1,8,9]也是一个合法序列 [3,4,5,1,2,9,8,7,6]就是一个非法序列 判断方法有两种,一种是对每一个值,其后所有小于它的值的数是一个降

栈初始化,入栈,出栈功能的实现

1 ////////////////////////////////////////////////////////// 2 // stack.cpp 3 // 4 // author:Leetao 5 ////////////////////////////////////////////////////////// 6 // 简介: 7 // 线性表的实现 8 ////////////////////////////////////////////////////////// 9 /** 1

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

数据结构学习——栈的出栈次序及次序种类

学过数据结构的程序猿应该都清楚,栈是一种先入后出,后入先出(LIFO)的表.即插入和删除都只能在一个位置上进行,即栈顶位置.对栈的基本操作有Push(入栈)和Pop(出栈).在一般软件研发的笔试中,就会经常遇到关于入栈次序一定时,出栈次序有哪些?共有几种? 其实,此处只要了解一下卡特兰数的算法结构,参见: http://baike.baidu.com/link?url=T7ZR16yiaWKNQPhem12nYJS56PqVeizOPnsGhBlynVFEy6JbB8CrMYKIetkvYm4Q

栈(出栈序列)

已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列. 例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop Input 输入数据包含若干组测试样例. 每组测试样例的第一行为整数N(1≤N≤10000): 第二行为N个正整数,以空格隔开,为出栈序列: 输入数据的末尾以一

栈之出栈序列合法性

#include<stdio.h> #include<string.h> #define MaxSize 100 typedef int DataType; typedef struct { DataType stack[MaxSize]; int top; }SeqStack; void StackInitiate(SeqStack *s)//初始化 { s->top=0; } int StackNotEmpty(SeqStack s)//非空否 { if(s.top<

栈的出栈序列个数

有n个数$1,2,3,4,...n$依次入栈,不必等全部的数入完再出,问有多少个出栈顺序? 解: 设问题答案是$f(n)$ ,$f(1)=1,f(2)=2$ 分n种情况: 1最后出来: $ f(n)$ k最后出来:$f(k-1)*f(n-k)$ 所以  $$f(n+1)=f(n)+f(n-1)f(1)+f(n-2)f(2)+......f(k)f(n-k)+......f(n)$$ 这是Catalan数的递推式: 得$$f(n)=\frac{C^{n}_{2n}}{n+1}$$ 原文地址:htt

栈的操作(创建,入栈,出栈,清空,遍历等等)

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data; struct Node *pNext; }NODE,*PNODE; typedef struct Stack { PNODE pTop; PNODE pBottom; }STACK,*PSTACK; void init(PSTACK pS); void push (PSTACK pS,int va