一个指针(int *p)加上一个整数n,表示从p指向的地址向后移动n*sizeof(int)个字节,得到的新地址。
s.base相当于上述的int *p,s.stacksize相当喊慎贺于整数n。s.top即得郑派到的新地址。
s.base是栈底指针,s.stacksize是栈长,s.top是栈顶指孝坦针。
S是一并迹猛个结构体, 有一个成员stacksize, STACKINCREMENT可能是个宏, SElemType是一个自定义类型, 可州空能也是结构体。这句话的意思就是: 两个数相加再乘以一个结构绝桥体大小。
在源程序上增加测试指针,可以看出,test的值的变化,这说明去掉对空间的判断,将引来严重后果。如果型山最大值是22,输入25个测试数据,看看test变化#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10 //
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct stack{
int *base
int *top
int stacksize//当前已分配的存储空间,以元素为单位
}SqStack
double *test//测试指针
int InitStack(SqStack &S)
{//构造一个空栈
S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int))
if(!S.base) exit(OVERFLOW)
S.top=S.base
S.stacksize=STACK_INIT_SIZE
//增加test空间,并显示分配内存地址,记录最大个数
test=(double*)malloc(sizeof(double))
printf("S.base=%p,Smax=%p,test=%p\n",S.base,S.base+S.stacksize,test)
printf("最大个数为:%d\n",(int*)test-S.base)
return OK
}
int GetStack(SqStack S,int &e)
{//弱栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR
e=*(S.top-1)
// S.top++
return OK
}
int Push(SqStack &S,int e)
{//插入元素e为新的栈顶元素
//if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
//{
// S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int))
/卜耐中/ if(!S.base) exit(OVERFLOW)//存储空间分配失败
// S.top=S.base+S.stacksize
// S.stacksize+=STACKINCREMENT
//}
*S.top++=e
//S.top++
return OK
}
int Pop(SqStack &S,int &e)
{//弱栈不空,则删除栈S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR
e=*--S.top
return OK
}
int main(void)
{
SqStack S
int stat,i,e,n
stat=InitStack(S)
printf("请输入你要进栈的元素个数n:")
scanf("%d",&n)
*test=3.14
printf("test初值=%lf\n",*test)
for(i=0i<ni++)
{
printf("\n请输入你要进栈的元素e:")
scanf("%d",&e)
stat=Push(S,e)
}
printf("test现在值=%lf\n",*test)
stat=GetStack(S,e)
printf("\n输出出栈亩念的元素:")
for(i=0i<ni++)
{
stat=Pop(S,e)
printf("%3d\n",e)
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)