1. 程式人生 > >入棧出棧的問題(彙總)

入棧出棧的問題(彙總)

#include <stdio.h>
#include <malloc.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));
  s-> top   =   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("%2d",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;

       ii.stk=ss.stk=oo.stk=NULL;//必須要初始化,因為如果沒有初始化那麼就會使得數沒定義,會出錯
        if(stackempty(input))   {       /*如果資料已經全部輸入完畢*/  
               while(!stackempty(s)){
          push(output,pop(s));
       }
       outputstack(output);
        }
        else   {     /*還有元素要輸入*/
                if(!stackempty(s))   {     /*我們需要儲存現有狀態*/ 
                         copystack(&ii,   input); 
                         copystack(&ss,   s); 
                         copystack(&oo,   output);
                        push(&oo,   pop(&ss));
                        stackseq(&ii,   &ss,   &oo);
                }
                push(s,pop(input));     /*再輸入一個元素*/
                stackseq(input,   s,   output);
        }
}
void main()  
{
 int   i,n;
  stack input,s,output;
   initstack(&input,20);
    initstack(&s,20);
    initstack(&output,20);
 printf("Input n:\n");
 scanf("%d",&n);
  for(i=n;i> 0;i--)  
   push(&input,i);
 stackseq(&input,&s,&output);
}