如果进栈顺序为A,B,C和D,则可能的出栈序列是?不求答案,求编程解决问题的代码。 求高手指教!
楼上的你的答案可以,但是人家没有这个选项啊!!!
选B
A和B先进栈
然后B出栈
C和D再进栈
D再出栈
C再出栈
最后A再出栈
B,C,D都是可能的序列
A不可能。
解答:
B==》
A、B进栈,B出栈,C、D进栈,D出栈,C出栈,A出栈
C和D方案类似。
A存在的最大问题是子序列C,A
#include <string.h>
#define N (4) //N>1
char in_str[N+1] = "ABCD";
int count = 0;
//对[start,n)区间进行全排列
void Permunation(char *in_str,int start,int n);
//注意,由于出栈序列个数为C(2n,n)/(n+1),故若n较大时,count计数会出错,并且该程序在短时间内无法完成!
int main(void)
{
Permunation(in_str,0,N);
printf("总共%d种出栈序列\n",count);
return 0;
}
//是否为正确的出栈序列,排除错误序列——假定入栈序列为p1,p2,p3,p4,则错误序列中含有pi,pj,pk满足
//以下条件:pj < pk < pi,如出栈序列中含有p4 p2 p3(不要求pi,pj,pk连续)
//这里的p1,p2,p3,p4对应的是入栈顺序,如A-1,B-2,C-3,D-4,这里字符ABCD刚好满足这种大小关系故可以不增加入栈顺序数组
int IsPopLiner(const char *pop_str)
{
int len = strlen(pop_str);
int i,j,big1,big2;
for(i = 1; i < len - 1; ++i)
{
big1 = i;
for(j = 0; j < i; ++j) //选出i前比pop_str[i]大的最大元素
if(pop_str[j] > pop_str[big1])
big1 = j;
if(big1 != i) //i前存在比pop_str[i]大的元素
{
big2 = i;
int one = 1;
for(j = i + 1; j < len; ++j) //找出i后比pop_str[i]大的最小元素
if(one && pop_str[j] > pop_str[i])
{
one = 0;
big2 = j;
}
else if(pop_str[j] > pop_str[i] && pop_str[j] < pop_str[big2])
big2 = j;
if(big2 != i)
{
if(pop_str[i] < pop_str[big2] && pop_str[big2] < pop_str[big1])
return 0;
}
}
}
return 1;
}
//对[start,n)区间进行全排列
void Permunation(char *in_str,int start,int n)
{
int temp;
if(start == n)
{
if(IsPopLiner(in_str)) //是正确的出栈序列
{
printf("%s\n",in_str);
++count;
}
return;
}
//全排列时,每个元素都可以放到起始位置
for(int i = start; i < n; ++i)
{
if(i != start) //减少自身交换
{
temp = in_str[start];
in_str[start] = in_str[i];
in_str[i] = temp;
}
//对剩余序列进行全排列
Permunation(in_str,start + 1, n);
//回溯
if(i != start) //减少自身交换
{
temp = in_str[start];
in_str[start] = in_str[i];
in_str[i] = temp;
}
}
}
//另一种方法就是用递归进行模拟入栈出栈情况!,你自己想吧,谢谢!
#include<iostream>
using namespace std;
int n=4;
string s="abcd";
//全局变量是非常危险的事情。
void fn(int a,int b,int data1[],int result1[])
{
//a是栈中元素的个数,b是还未入栈的元素的个数。
int result[4];//记录路径。
int data[4];//记录栈中的元素。
memcpy(data,data1,4*sizeof(int));
memcpy(result,result1,4*sizeof(int));
if(b==0)
{
//打印结果。
while(result[b])
{
cout<<s[result[b++]-1];
}
for(int i=a-1;i>=0;i--)
{
cout<<s[data[i]-1];
}
cout<<endl;
}
else
{
data[a]=n-b+1;
a++;
b--;
fn(a,b,data,result);
a--;
b++;//恢复数据。
data[a]=0;
if(a>0&&b!=0)
{
result[n-a-b]=data[a-1];
data[a-1]=0;
a--;
fn(a,b,data,result);
}
}
}
int main()
{
int data[4]={0};
int result[4]={0};
fn(0,4,data,result);
return 0;
}
dcba
cdba
cbda
cbad
bdca
bcda
bcad
badc
bacd
adcb
acdb
acbd
abdc
abcd
请按任意键继续. . .
编程啊?这一般都是选择题的啊
如果进栈序列为A,B,C,D,则可能的出栈序列是()。
【答案】:B 【解析】栈的操作原则为后进先出。选项B)中出栈顺序可按“A进,8进,8出,C进,D进,D出,C出.A出”实现。
求大佬帮忙答题若进栈序列为a,b,c,d,进栈过程中可以出栈,则下列不可能...
C选项。要想第一个出栈为c,只能先进栈a,b,c然后出栈c,此时还剩a,b,因此a不可能接着c出来。
元素的进栈次序为A,B,C,D,E,则退栈中不可能的序列是( )
C栈是限定只能在表的一端进行插入和删除的线性表元素依次进栈:A、B、C、D、E 并不是说让所有元素一次性全部进栈,进栈元素个数你可随意指定而C如果第一个出栈元素是E的话也就是说,A、B、C、D都已经进栈且都没有出栈,那么你仔细想想既然D还没有出栈,A、B、C又怎么能出来呢?顺便告诉...
如果进栈顺序为A,B,C和D,则可能的出栈序列是
楼上的你的答案可以,但是人家没有这个选项啊!!!选B A和B先进栈 然后B出栈 C和D再进栈 D再出栈 C再出栈 最后A再出栈
如果进栈顺序为A,B,C和D,则可能的出栈序列是?不求答案,求编程解决问 ...
\/\/这里的p1,p2,p3,p4对应的是入栈顺序,如A-1,B-2,C-3,D-4,这里字符ABCD刚好满足这种大小关系故可以不增加入栈顺序数组 int IsPopLiner(const char *pop_str){ int len = strlen(pop_str);int i,j,big1,big2;for(i = 1; i < len - 1; ++i){ big1 = i;for(j = 0; j...
栈的进栈顺序和出栈顺序是什么?
计算机中进栈顺序为abcde,则出栈顺序有dcbae、abcde、edcba3种。栈的出栈是遵循先进后出的原则,abcde的进栈顺序并不是一次性的按照abcde入栈,也可能是先入栈一部分再出栈一部分在进行入栈,整体的入栈顺序是不变的依然是abcde。出栈的元素顺序可以遵守的规律如下:1、在原序列中相对位置比它靠前的...
计算机中进栈顺序为abcde,则出栈顺序有哪些
出栈顺序为edcba。多用于计算机,与其相对应的是进栈;进栈、出栈多是按照一定顺序的。进栈出栈就像一个盒子,先一个个放入盒内,而拿出的时候只有先从上面拿,才能再拿下面。例如:有一个数列(23,45,3,7,3,945),先对其进行进栈操作,则进栈顺序为:23,45,3,7,3,945,再对其进行...
对于初始为空的栈S,入栈序列为a、b、c、d、e,且每个元素进栈、出栈各1...
【答案】:C栈的特点是先进后出的,如下图所示,且每个元素进栈、出栈各1次,经分析e第一个出栈,d第二个出栈的话,后面只能跟c,不可能跟a。
栈的入栈顺序和出栈顺序是什么样的?
入栈顺序:a、b、c、d。出栈顺序可以是:d、c、b、a;a、b、c、d;b、a、c、d很多,但要把栈想像成一个没盖子的纸箱,取出东西时只能从最上层取,放进东西也只能放在最上层,所以栈是一个“后进先出”或“先进后出”的顺序存储结构。相关介绍:栈又名堆栈,它是一种运算受限的线性表。限定...
进出栈的顺序
如果进栈的顺序是a,b,c,d。问题1:那么出栈的顺序有没有可能是a,b,c,d 答:可能 a进->a出->b进->b出->c进->c出->d进->d出(一个数据进栈后不用等其它元素出栈就可以出栈)问题2:出栈的顺序有好多种 答:正确。N个数据进栈有(C(2n,n)\/(n+1) [C(n,m)表示n选m的组合数]...
符穆霡欣: 楼上的你的答案可以,但是人家没有这个选项啊!!!选B A和B先进栈 然后B出栈 C和D再进栈 D再出栈 C再出栈 最后A再出栈
新乐市17727454397: 如果进栈的元素序列是A,B,C,D,则可能得到的出栈序列有多少种? - ?
符穆霡欣: ABCD ABDC ACBD ACDB ADCBBACD BADC BCAD BCDA BDCACBAD CBDA CDBADCBA穷举出14种
新乐市17727454397: 如果进栈的数据元素序列为A,B,C,D,择可能得到的出栈序列有多少种?写出全部可能的序列 - ?
符穆霡欣:[答案] 有个公式,可算出多少种情况 1/(n+1) *C(2n,n) 所以应该有14种情况 ABCD;ACBD;ACDB;ABDC;ADCB;BACD;BADC;BCAD;BCDA;BDCA;CBAD;CBDA;CDBA;DCBA
新乐市17727454397: 假定有4个元素A,B,C,D依次入栈,则可能的出栈的序列有() - ?
符穆霡欣: ABCDE 栈就像个筒子 只能从最外面一个一个的出来 ABCD一次进栈从栈口到里面是DCBA 如果是多选的话 那就是没有一次性放完·· A :A> B> B< C> C< A< D> D< BCAD B:A> B> C> C< D> D< B< A< CDBA C: A> A< B> B C D>表示进 以此类推···
新乐市17727454397: 栈的入栈顺序和出栈顺序的各种可能??? - ?
符穆霡欣: 举一个例子吧.入栈顺序:a、b、c、d 出栈顺序可以是:d、c、b、a;a、b、c、d;b、a、c、d很多啦, 但要把栈想像成一个没盖子的纸箱,取出东西时只能从最上层取,放进东西也只能放在最上层,所以栈是一个“后进先出”或“先进后出”的顺序存储结构.
新乐市17727454397: 如果进栈的元素序列为、A.B.C.D,则可能得到的出栈序列有多少? - ?
符穆霡欣: 大约有这么几种吧!ABCD BACD BADC BCAD BCDA CBAD CBDA CDBA DCBA BACD 一共十种吧!
新乐市17727454397: (1)A,B,C,D依次入栈 - ?
符穆霡欣: (1)一个栈的初始状态为空.首先将元素5,4,3,2,1依次入栈,然后退栈一次,再将元素 A,B,C,D依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为【1DCBA2345】(2)在长度为n的线性表中,寻找最大项至少需要比较【n-1】次.
新乐市17727454397: 数据结构中有关栈的问题..... - ?
符穆霡欣: (1)3,你看看进出顺序:栈先进入a,然后b进站(栈中有ab),b出战(栈中只有a),c进站,d进站(此时栈中有acd),d出战,c出战(栈中只有a),e进站,f进站(栈中aef),e出战,f出战(栈中只有a),a出战(栈空!).栈中最多的时候是acd或者aef,所以至少容量大于3!(2)3.1.2!1.2.3先后进站,3在顶,1在底,2在中间!3先出战,现在只能是2出战,不可能是1,因为2在1的上面!栈是后进先出的,多看看书,看动画演示,你就更容易明白了!我说的够详细了吧,给加分吧,呵呵!
新乐市17727454397: 元素的进栈次序为A,B,C,D,E,则退栈中不可能的序列是( ) - ?
符穆霡欣: C栈是限定只能在表的一端进行插入和删除的线性表元素依次进栈:A、B、C、D、E 并不是说让所有元素一次性全部进栈,进栈元素个数你可随意指定而C如果第一个出栈元素是E的话也就是说,A、B、C、D都已经进栈且都没有出栈,那么你仔细想想既然D还没有出栈,A、B、C又怎么能出来呢?顺便告诉你一个技巧:如果指定元素的进栈顺序,那么它的出栈顺序就有一个特点,那就是越往后的元素如果先出栈的话,那么其前面的元素出栈顺序就不可能与进栈顺序相同.就如C:E元素是后来进栈的,那么E元素出栈后,就不可能有A,B顺序出栈(和进栈顺序相同)这种可能你仔细看看,我也不知道我说明白了没有要是不明白在问我吧
新乐市17727454397: 若进栈序列为a,b,c,d,e则通过入出栈操作可能得到a,b,c,d,e的不同排列个数为多少? - ?
符穆霡欣: 这中组合有很多;你自己对着这规律找一下进in 出out1,a 进 出 b 进 出 c 进 出 d 进 出 e 进 出 ;得a b c d e2,a 进 b进 (现在如果出来的话,只能是b先出,a 后出,当然中间也可以进入其他)b 出 a 出 c进 出 d进出,e进出 得 b a c d e;3,a 进 b进 c 进 d 进 e进 e出 d 出 c 出 b 出 a 出 得e d c b a(先进后出)……自己理解一下!你应该能够全部写出来!