顺序栈的表示和实现 (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

猜你喜欢

转载自blog.csdn.net/mu66mu/article/details/84146826