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