给一串数字,输出所有的出栈序列

 基本思想:递归。
图1. 输入为(123)的进出栈过程
对上图进行分析:在每个节点可能有两种操作:进栈,出栈。进栈则转入左子树,出栈则进入右子树。当“未处理”元素为空时,输出序列就已经确定(如图1绿色节点所示)。注意在回退时需要维护输出队列和栈的状态。
程序如下:
#include #include #include using namespace std; void func(int A[], int j, int n, vector &stk, vector &que) { static int cnt = 0; if (j >= n){ cout << ++cnt << ": "; for (unsigned int k = 0; k < que.size(); k++){ cout << setw(5) << que[k]; } for (int k = stk.size() - 1; k >= 0; k--){ cout << setw(5) << stk[k]; } cout << endl; return; } stk.push_back(A[j]); /*enter stack*/ func(A, j + 1, n, stk, que); /*left subtree*/ stk.pop_back(); /*return to current*/ if (!stk.empty()){ /*pop stack*/ que.push_back(stk.back()); stk.pop_back(); func(A, j, n, stk, que); /*right subtree*/ stk.push_back(que[que.size() - 1]); que.pop_back(); } } int main() { int A[] = {1, 2, 3}; vector stk; vector que; func(A, 0, sizeof(A) / sizeof(int), stk, que); return 0; } 

你可能感兴趣的:(算法)