Ⅰ 1,2,3,4依次进栈,出栈随时,写一算法求出所有可能出栈序列
代码如下:
#define N 4
int m=0,a=0,b=N;/*m表示种数,a表示栈中元素个数,b表示外面还有需要进栈的个数*/
main()
{
inS(a,b);/*首先入栈*/
printf("%d",m);
getch();
}
int inS(int a,int b)/*入栈*/
{
a++;b--;/*入栈栈中元素+1,栈外元素-1 */
if(b>0)/*若栈外有元素,可以入栈*/
inS(a,b);
if(a>0)/*若栈中有元素,可以出栈*/
outS(a,b);
}
int outS(int a,int b)/*出栈*/
{
a--;/*出栈栈中元素-1*/
if(a==0&&b==0)/*若栈中元素和栈外元素都为0个*/
{
m++;/*则此种情况的序列满足条件,种数+1*/
return;
}
if(b>0)
inS(a,b);
if(a>0)
outS(a,b);
}
(1)进栈算法代码扩展阅读
栈的相关知识点:
顺序栈内容包含数据和栈顶指针(int),因此采用结构体。
注意:
1、初始时,top指向-1;
2、入栈时,先判断顺序栈是否已满(判断条件:top=maxsize-1);如果没满,则top++,并将元素值赋给s.top;
3、出栈时,先判断顺序栈是否已空(判断条件:top=-1);如果没空,则先返回栈顶元素,再top- -。
共享栈
两个顺序栈共享一个一维数组空间,而栈底位置相对不变,两个栈底分别设为一维数组的两端。
note:
(1)栈空:top1==-1&&top2==maxsize;
(2)栈满:top2-top1= 1(此时两个栈顶指针相邻);
(3)入栈:S.data[++top1]=x或S.data[–top2]=x;
(4)出栈:x=S.data[top1–]或x=S.data[top2++];
(5)共享栈可以更好的利用存储空间,整个存储空间被占满时发生上溢。