標籤:
棧的構成及初始化
對於“先進後出”的順序棧,需要控制3個量:棧元素,棧頂指標,棧容量。
棧容量即棧的最大容量,若超過會產生溢出錯誤。當然,必要時也可以擴充容量。
棧元素可以通過動態數組( base[] )存放。初始化時用 malloc 申請(棧容量 * 元素類型)個空間。
棧頂指標用於記錄棧元素個數,始終指向棧頂元素的上一個單位(如 棧頂元素為base[3],棧頂指標為4),這樣就能實現元素個數的記錄。不過,棧頂指標只是一種形象化的叫法,方便起見,一般將其定義為 int 型。初始化時,棧頂指標置0。
定義結構體
struct sta
{
int top;
int *base;
int size;
};
typedef struct sta ZAN;
棧的建立(分配空間)
ZAN* create()
{
ZAN *p;
p=(ZAN *)malloc(sizeof(ZAN));
return p;
}
棧的初始化
void zer(ZAN *s)
{
s->top=0;
s->size=INI; //#define INI 10
s->base=(int *)malloc(INI*sizeof(int));
}
壓棧
壓棧就是讓元素進棧,棧頂指標 top 加一,元素存入數組 base[] 。如果已經棧滿,可以增加記憶體空間(實際上是重新分配空間),此時棧容量 size 也要加一。用傳回值判斷是否壓棧成功。
int push(ZAN *s,int x)
{
if( (s->top) >= (s->size) )
{
s->base=(int *)realloc(s->base,(s->size+1)*sizeof(int));
if(!s->size) return 0;
s->size++;
}
s->top++;
s->base[s->top-1]=x;
return 1;
}
取棧頂元素
取頂只用把棧頂元素的值記錄下來,而不需要讓其出棧。可以用指標來取值。同樣,用傳回值判斷是否取頂成功。
int gettop(ZAN *s,int *e)
{
if(s->top==0) return 0;
else
{
*e=s->base[(s->top)-1];
return 1;
}
}
彈棧
彈棧是取出其值,並讓棧頂元素出棧,top減一。同樣,用指標記錄其值,用傳回值判斷是否彈棧成功。
int pop(ZAN *s,int* e)
{
if(!s->top) return 0;
else
{
*e=s->base[(s->top)-1];
s->top--;
return 1;
}
}
求棧長
取出 top 的值即可
int getlen(ZAN* s)
{
return s->top;
}
判斷棧是否為空白
看 top 是否為0即可
int isempty(ZAN* s)
{
if(!s->top) return 0;
else return 1;
}
輸出棧元素
將 base[] 自頂向下輸出即可,不對棧進行任何操作。
void list(ZAN* s)
{
int i;
puts("\n list ZAN:");
for(i=s->top-1;i>=0;i--)
{
if(i!=s->top-1) printf("\n"); //此處可以用空格代替換行
printf("%d",s->base[i]);
}
puts("");
}
測試功能
// TEST FUNCTION
main()
{
ZAN *create();
void zer(ZAN *s);
int push(ZAN *s,int x);
int gettop(ZAN *s,int *e);
int getlen(ZAN* s);
int isempty(ZAN* s);
void list(ZAN* s);
ZAN *s;
int n,*e,i=1;
i=1;e=&i; // protect
s=create(); // create a stack
zer(s); // initialize
if(!isempty(s)) puts("ZAN is empty\n"); // empty?
else puts("ZAN is not not empty\n");
puts(" push int x:"); // push an element in
scanf("%d",&n);
if(push(s,n)) ;
else printf(" push %d error\n",n);
if(gettop(s,e)) printf("gettop %d\n",*e); // get top element
else puts("gettop error");
printf("\n push int x:\n");
scanf("%d",&n);
if(push(s,n)) ; // push an element in
else printf("push %d error\n",n);
if(gettop(s,e)) printf("gettop %d\n",*e); // get top element
else puts("gettop error");
if(pop(s,e)) printf("pop %d\n",*e); //pop top element
else printf("pop %d error\n",n);
if(gettop(s,e)) printf("gettop %d\n",*e); // get top element
else puts("gettop error");
if(!isempty(s)) puts("ZAN is empty\n"); // empty?
else puts("ZAN is not not empty\n");
if(isempty(s)) list(s);
printf("\n push int x:\n");
scanf("%d",&n);
if(push(s,n)) ; // push an element in
else printf("push %d error\n",n);
if(isempty(s)) list(s); //output ZAN
}
C語言實現順序棧心得