入棧出棧的問題(彙總)
#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);
}