輸出所有可能的出棧順序
阿新 • • 發佈:2021-02-20
技術標籤:學習記錄
#include <stdio.h>
#include<stdlib.h>
typedef struct //構造棧類結構體
{
int *stk;//棧內指標
int top;//棧頂指標
int size;//棧的大小
} stack;
void initstack(stack *s, int n) //初始化棧的結構
{
s->stk = (int*)malloc((s->size=n) * sizeof(int));//申請n個棧的記憶體
s->top = 0;//棧頂指標設定為0
}
void copystack (stack *ss, stack *s)//複製函式
{
int i;
if(ss->stk)//進行清零操作
free(ss->stk);
ss->stk =(int*)malloc((ss->size=s->size) * sizeof(int));//申請記憶體空間
ss->top = s->top;//棧頂指標進行復制
for(i=s->top-1; i>=0; i--) //進行復制操作
ss->stk[i] = s->stk[i];
}
void outputstack(stack* s) //輸出函式
{
int i;
for(i=0; i<s->top; i++) printf("%d ", s->stk[i]);
printf("\n");
}
int stackempty(stack* s)//判斷棧是否為空
{
return !s->top;
}
void push(stack* s, int x)//把新的元素壓入棧
{
s->stk[s->top++] = x;
}
int pop(stack* s) //把函式送出棧
{
return s->stk[ --s->top];
}
void stackseq(stack *input, stack *s, stack *output)
{
/*初始狀態:棧input中存放要輸入的元素,s, output為空
結束狀態:input 和 s 均為空*/
stack ii, ss, oo;
if(stackempty(input))
{ /*如果資料已經全部輸入完畢*/
if(stackempty(s))
outputstack(output); /*而且棧中也沒有剩餘,則輸出序列*/
else
{
push(output, pop(s)); /*棧中元素進入輸出序列*/
stackseq(input, s, output);/*重新排程*/
}
}
else
{ /*還有元素要輸入*/
if(!stackempty(s))
{ /*我們需要儲存現有狀態*/
initstack(&ii, 1); copystack(&ii, input);
initstack(&ss, 1); copystack(&ss, s);
initstack(&oo, 1); copystack(&oo, output);
push(&oo, pop(&ss));
stackseq(&ii, &ss, &oo);
}
push(s, pop(input)); /*再輸入一個元素*/
stackseq(input, s, output);
}
}
void main() //主函式
{
int n,i;
stack input, s, output;//定義棧型變數input,output
initstack(&input, 20);//分別對input進行初始化棧
initstack(&s, 20);//對s進行初始化棧
initstack(&output, 20);//對output初始化棧
scanf("%d",&n);//輸入你要出棧的截止數字
for(i=n; i>0; i--) //將1到n所有的數字進行入棧
push(&input, i);
stackseq(&input, &s, &output);//呼叫函式進行遞迴
}