天天看點

順序棧的表示和實作 (C語言)

/*
	順序棧的表示和實作 
*/

#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

繼續閱讀