1. 程式人生 > 其它 >輸出所有可能的出棧順序

輸出所有可能的出棧順序

技術標籤:學習記錄

輸出所有出棧順序

#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);//呼叫函式進行遞迴 }