順序棧的表示和實現 (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);
}

注意:函數定義時  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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章