假设栈的输入序列为1、2、3、...、n,求出所有可能的出栈序列

假设栈的输入序列为1、2、3、...、n,设计算法求出所有可能的出栈序列(合法序列)。 
比如 n = 4,出栈序列可能有1 2 3 4 , 1 2 4 3 , 1 4 3 2 , 1 3  4 2等等  

我使用递归来完成,主要思想:从1到n输入,每一个数只对应两个操作,一个是入栈,一个是出栈(输出),我用一个栈保存入栈元素,一个数组保存出栈元素(这里也可以使用栈,但是输出元素时,需要从反向输出)。 

void print_valid_sequence(int i,const int n )
 {
     static int number = 0;//记录序列的个数
     static Stack stack;//保存入栈的元素
     static int array[10];//保存输出的元素
     int top;//用来取top
     if(i == n+1)//递归结束条件,输出序列
     {
         ++number;
         cout << number << "---";
         for(int j = 0;j < n-stack.length();++j)
            cout << array[j];//正序输出
         stack.print();//输出
         cout << endl;
    }
    else
    {
        stack.push(i);//入栈
        print_valid_sequence(i+1,n);
        stack.pop();//为保持stack不变,出栈
 
        if(!stack.empty())//将栈顶元素输出
        {
            stack.getTop(top);
            array[i-stack.length()-1] = top;//将输出的元素放入array中
            stack.pop();
            print_valid_sequence(i,n);//i不变
            stack.push(top);
        }
    }
}

 

?

你可能感兴趣的:(算法与数据结构)