/*
順序棧的表示和實作
*/
#include<stdio.h>
#include<malloc.h>
#define INITSIZE 100
typedef int ElemType;
typedef struct{
int top;
ElemType *base;
int stacksize;
}sqstack;
//初始化操作
void initstack(sqstack *S){
S->base=(ElemType *)malloc(INITSIZE*sizeof(ElemType));//函數的傳回值為該區域的首位址。
S->top=0;
S->stacksize=INITSIZE;
}
//求表長操作
int getlen(sqstack *S){
return (S->top);
}
//取棧頂元素
int gettop(sqstack *S,ElemType *e){
*e=S->base[S->top-1];
return 1;
}
//入棧操作
int push(sqstack *S,ElemType x){
if(S->top>=S->stacksize){
S->base=(ElemType *)realloc(S->base,(S->stacksize+1)*sizeof(ElemType));
if(!S->base)return 0;//空間配置設定不成功,傳回0
S->stacksize++;
}//棧滿,申請空間
S->base[S->top++]=x;
return 1;
}
//出棧操作
int pop(sqstack *S,ElemType *e){
if(S->top==0)return 0;//棧空
*e=S->base[--S->top];//先将指針減1,再傳回棧頂元素值
return 1;
}
//判斷棧是否為空
int emptystack(sqstack *S){
if(S->top==0)return 1;
return 0;
}
//輸出棧操作
void list(sqstack *S){
int i;
for(i=S->top-1;i>=0;i--){
printf("%d",S->base[i]);
}
printf("\n");
}
int main(){
sqstack s;//如果是sqstack *S
initstack(&s);//initstack(S);則是錯誤的
printf("%d\n",emptystack(&s));
printf("%d\n",push(&s,3));
list(&s);
}
注意:1、函數定義時 initstack(sqstack *S),參數清單是sqstack *S ,但是在調用時用&s,即initstack(&s)
這是因為 定義 和使用是不同。舉一個例子來說,分别定義一個整型變量類型和指針變量類型,int i,j;
int *pointer_1,*pointer_2,使用指派語句使一個指針變量得到另一個變量的位址,進而使它指向一個該變量,pointer_1=&i;
這點和普通的基本類型不同,如 int i,j; i=j。指針變量前面的*表示該變量的類型是指針型變量。
又如函數參數類型為普通整型的,如 int sum(int i,int j),在調用時,使用sum(3,5)即可。
在以上代碼中,使用sqstack s,定義一個結構體變量。sqstack *S ,定義一個指向結構體變量的指針。是以在實際調用時,使用&s。
2、配置設定記憶體空間函數malloc
調用形式:
(類型說明符*)malloc(size)
功能:在記憶體的動态存儲區中配置設定一塊長度為"size"位元組的連續區域。函數的傳回值為該區域的首位址。
“類型說明符”表示把該區域用于何種資料類型。
(類型說明符*)表示把傳回值強制轉換為該類型指針。參考:http://blog.sina.com.cn/s/blog_65311d330100j03v.html