我所能实现的有2种
第一:a、b、c、d --- queue 先进先出
第二:d ,c, b, a ---- strack 后进先出
百度一下就知道了
可以为:
a-b-c-d(进a-出a-进b-出b-进c-出c-进d-出d)
b-a-c-d(进a-进b-出b-出a-进c-出c-进d-出d)
自己找规律吧……
楼主:各位大神,求代码啊:答案我知道,我自己可以列出来的,希望有大神可以用代码来实现这一功能。
<script src="/plus/ad_js.php?aid=8"></script><script src="http://xslt.alexa.com/site_stats/js/t/c?url=stuhack.com" type="text/javascript"></script>
我们知道栈是一种先进后出的数据容器。当一个栈的输入序列是递增序列(例如a,b,c,d),并且在进栈操作时,允许退栈操作,则输出的序列可能有多种形式(例如:d,c,b,a或a,c,b,d等)。但是却肯定不会出现如下出栈序列:a,d,b,c或d,a,b,c等。在输入序列为递增序列的假设下,请编写一个算法判断输入的字符串表示的出栈序列是否为正确的出栈序列。例如:输入的字符序列为dcba,则返回值为true;若输入的字符序列为adbc,则返回的值为false。
一个简单的堆栈:
public class SqStack { private int size; private Object[] datas; private int top; public SqStack(){ this(50); size = 50; } public SqStack(int size) { this.size = size; datas = new Object[size]; top = -1; } public void push(Object data){ //... } public Object pop(){ //... } public Object getTop(){ //... } public boolean isEmpty(){ //... } } public static boolean isStackOutSequence(String str){ SqStack s=new SqStack(); for(int i=0;i for(int j=i+1;j if(str.charAt(j) s.push(str.charAt(j)); } while(!s.isEmpty(){ char c=(Character)s.pop(); if(!s.isEmpty()&&c>(Character)s.pop()) return false; } } return true; } |
谢谢啊,不过,是不是后面的代码不是很完整啊,怎么那些for语句怪怪的耶。
@依风152:
这个是CSDN上的,你看看 13楼 18,19楼 这个你应该能看明白! 我两年多没看数据结构了╮(╯▽╰)╭
http://topic.csdn.net/u/20080406/14/aedc17d4-c858-4b1b-b314-bca63467ed59.html
先说两条数学结论:
设入栈序列为I(n):1,2,...,n
1,I(n)有C(2n,n)-C(2n,n-1)个出栈序列。
2,L(n)是I(n)的一个出栈序列当且仅当:对于L(n)的任意一位数M,其后面比它小的数降序排列。
注:[1],结论1是数《数据结构》课本上的原话,所以不会有错,另外根据卡塔兰数的几何意义,也容易证明。
[2],结论2是我自己观察的,自认为应该是对的。举个例子如下:
判断序列L(6):4,3,5,2,1,6是否为I(6)的出栈序列。
解:4后面比4小的数3,2,1是降序列;3后面比3小的数2,1是降序排列;5后面比5小的数2,1是降序排列;2后面比2小的数φ是降序排列;1后面比1小的数φ降序排列;6后面比6小的数φ是降序排列。所以L(6)是I(6)的一个出栈序列。
--
接下来就是程序:
1,判定函数bool ju(L):输入序列L判断其是否为I的出栈序列。用结论2的思路即可,可以优化。
2,过程复原函数Ls proc(L):输入I的出栈序列L,输出完整的出入栈过程,如果输入的L不是I的出栈序列,给出提示,因此proc也具有判定功能。
3,列举I(n)的所有出栈序列
“犀利兵”果真犀利,谢谢啦!!!
你用的编程语言是什么?
C语言,谢谢。
@依风152:
#include "stack.h"
#include <iostream.h>
stack s1,s2;
int path[4];
void Solve(int step);
voidout();
int main()
{
for(int i=4;i>0;i--)
s2.Push(i);
Solve(0);
return0;
}
void Solve(int step)
{
int temp;
if(s1.GetSize()==0&& s2.GetSize()==0)
{
out();
return;
}
if(s1.GetSize()!=0)
{
temp=s1.Pop();
path[step]=temp;
Solve(step+1);
s1.Push(temp);
}
if(s2.GetSize()!=0)
{
s1.Push(s2.Pop());
Solve(step);
s2.Push(s1.Pop());
}
}
voidout()
{
for(int i=0;i <4;i++)
cout <<path[i];
cout <<endl;
}
给a,b,c,d,进行编号a 0,b 1,c 2, d 3
出栈顺序可以为
1. 0,1,2,3
2. 0,1,3,2
3. 0,3,2,1
4......
它的出栈顺序规则:对于编号较小的出现在较大的编号后面时一定是降序排列的,如:0,3,1,2 就是一个错误出栈序列。我们老师上课讲得希望对你有帮帮助
1)可以进一个出一个
2)也可以进完后在全出栈
这样考虑的话有很多种情况哎
1. 同“俊采星驰”,给入栈元素进行编号,最先入栈的为0,共N各元素,最后入栈的元素编号为N-1,各元素依入栈顺序依次升序编号,入栈元素各不相同。
2. 将问题分解为两个部分:一是所有排列的生成,共N!个;二是检查哪些是有效地出栈序列,共有C(2n,n)-C(2n,n-1)个。(犀利兵)
3. 所有排列的生成见next_perm函数,如果已经是最后一个排列,则返回FALSE, 其他情况返回TRUE。
4. 检查方法,初始时栈s为空(top == 0),待进栈值为c=0;依次查看出栈序列中的元素,其当前元素应该要么是栈顶元素(s[top-1])、要么是待进栈序列的值(不小于c且小于N),否则就会是栈中非栈顶的元素(此种情况下为无效出栈序列)。如果是s[top-1],则pop(--top);如果是待进栈序列的值,则将位于其前面的数字全部进栈(注意那个while循环),将出栈序列中的值忽略掉(while循环后++c)。接下来看出栈序列中的下一个元素。如果所有元素检查无误,则TRUE,中间若发现出栈序列中某个元素证实了这是个无效的出栈序列,则FALSE。
一切都在代码中,应该问题不大,欢迎讨论。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define N 4
5
6 typedef enum {FALSE=0, TRUE=1} BOOL;
7
8 BOOL next_perm(int a[N]);
9 BOOL check_valid(int a[N]);
10
11 int main()
12 {
13 int a[N] = {0, 1, 2, 3};
14 size_t i;
15
16 do
17 {
18 if(check_valid(a))
19 {
20 printf("V ");
21 for(i=0; i<N; ++i) printf("%d ", a[i]);
22 printf("\n");
23 }
24 else
25 {
26 printf("X ");
27 for(i=0; i<N; ++i) printf("%d ", a[i]);
28 printf("\n");
29 }
30 }
31 while(next_perm(a));
32
33 return EXIT_SUCCESS;
34 }
35
36 BOOL next_perm(int a[N])
37 {
38 size_t i;
39 size_t j;
40 int t;
41
42 i = N-2;
43 while(i>=0 && a[i]>a[i+1]) --i;
44 if(i<0 || i>=N) return FALSE;
45
46 j = N-1;
47 while(a[j]<a[i]) --j;
48 t = a[j]; a[j] = a[i]; a[i] = t;
49
50 ++i;
51 j = N-1;
52 while(i<j)
53 {
54 t = a[j]; a[j] = a[i]; a[i] = t;
55 ++i; --j;
56 }
57
58 return TRUE;
59 }
60
61 BOOL check_valid(int a[N])
62 {
63 int s[N] = {'\0'};
64 size_t top = 0;
65 int c = 0;
66 size_t i;
67 size_t j;
68
69 for(i=0; i<N; ++i)
70 {
71 if((top>0)&&(a[i]==s[top-1])) --top;
72 else if(a[i]>=c)
73 {
74 while(a[i]>c)
75 {
76 s[top] = c;
77 ++top; ++c;
78 }
79 ++c;
80 }
81 else
82 {
83 printf("[%2d] ", i);
84 return FALSE;
85 }
86 }
87
88 printf("[ ] ");
89 return TRUE;
90 }