Ⅰ 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)共享棧可以更好的利用存儲空間,整個存儲空間被占滿時發生上溢。