注册 登录
编程论坛 C++教室

[求助]数字1,2,3,4顺序入栈,问有多少种出栈方式。

Powerqy 发布于 2007-05-01 15:37, 4537 次点击

用的是Thinging in C++上的Stack类


这是头文件
//: C06:Stack3.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// With constructors/destructors
#ifndef STACK3_H
#define STACK3_H

class Stack {
struct Link {
void* data;
Link* next;
Link(void* dat, Link* nxt);
~Link();
}* head;
public:
Stack();
~Stack();
void push(void* dat);
void* peek();
void* pop();
};
#endif // STACK3_H ///:~


这是Stack的定义
//: C06:Stack3.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Constructors/destructors
#include "Stack3.h"
#include "../require.h"
using namespace std;

Stack::Link::Link(void* dat, Link* nxt) {
data = dat;
next = nxt;
}

Stack::Link::~Link() { }

Stack::Stack() { head = 0; }

void Stack::push(void* dat) {
head = new Link(dat,head);
}

void* Stack::peek() {
require(head != 0, "Stack empty");
return head->data;
}

void* Stack::pop() {
if(head == 0) return 0;
void* result = head->data;
Link* oldHead = head;
head = head->next;
delete oldHead;
return result;
}

Stack::~Stack() {
require(head == 0, "Stack not empty");
} ///:~


这是测试Stack的一个例子,实现倒序输出,我现在就死用上面的资源文件实现“数字1,2,3,4顺序入栈,问有多少种出栈方式?”
//: C06:Stack3Test.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
//{L} Stack3
//{T} Stack3Test.cpp
// Constructors/destructors
#include "Stack3.h"
#include "../require.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char* argv[]) {
requireArgs(argc, 1); // File name is argument
ifstream in(argv[1]);
assure(in, argv[1]);
Stack textlines;
string line;
// Read file and store lines in the stack:
while(getline(in, line))
textlines.push(new string(line));
// Pop the lines from the stack and print them:
string* s;
while((s = (string*)textlines.pop()) != 0) {
cout << *s << endl;
delete s;
}
} ///:~



谢谢!!!!!!

8 回复
#2
Powerqy2007-05-01 17:08

比如说是1,2先进栈,2出栈,然后3, 4进栈.那么输出的结果就是2431

倒序,后进先出

但我不能用程序把它表述完全,听老师说要用两重递归会比较简单一点?不解?请大家指教!

#3
nuciewth2007-05-01 19:39
以前用C写过一个,后来给弄掉了.
应该和全排列差不多,只是多了个条件.
#4
aipb20072007-05-03 00:05
这个不是火车进站出站的问题吗?

小规律,多试几个就总结到规律了!
#5
未入流小菜鸟2007-05-03 21:05

//如果只为算有多少种方式,那就纯粹是个数学问题,都不需要真的定义出一个栈。
int Fn(int n)
{
if(n<=1) return 1; //一个数时,只有一种输出
else return n*Fn(n-1); //n个数时,第n个数可以出现在(n-1)个数的间隙中(包括两头,共n个间隙)。
}
void main()
{
int cout;
printf("个数:"); //几个数,如楼主的题则为4
scanf("%d",&cout);
int num = Fn(cout);
printf("共%d种\n",num);
}
//如果要将相应的入栈和出栈显示出来,那就要另想办法了,呵呵。

#6
宇智波斑2007-05-04 11:01
可以用这个计算公式:Xn=(2n)!/[n!*(n+1)!],有四个数的话就有14种可能的出栈方式
#7
Powerqy2007-05-08 10:33
还是解决了,用的是二叉树,我是想输出每一种可能。而不是仅仅知道它的个数
#8
潇湘夜雨2007-05-11 21:35
用二叉树?不解,能不能把你的思路说一下
#9
leeco2007-05-14 23:36

如果要解就DFS,如果要值就Catalan数

1