定义
栈只能从栈顶对元素进行操作 ,每当元素入栈 s->top=e; s->top++;
栈的结构体
typedef struct{
SElemType *base;//存储空间基址
SElemType *top;//栈顶指针
int stacksize;//当前分配的储存容量,以元素为单位
}SqStack;//栈
栈的初始化:s->top=s->base
int InitSqStack(SqStack *S)
{
//分配100个数据的存储空间,并将空间的首地址存于S->base
S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
//判断空间分配是否成功,不成功返回0
if(!S->base) return 0;
//分配成功时给top,stacksize赋初值
S->stacksize=STACK_INIT_SIZE;
S->top=S->base;
return 1;
}
入栈(重要代码)
*(S->top)=e;
//上移top指针
S->top++;
出栈(重要代码)
S->top--;
*e=*(S->top);
显示(重要代码)
while(p>=S->base)
{
printf("%d ",*p);
p--;
}
二:总结
主要应用于进制的转换、计算机的是实现
三:源代码
/*先进后出FILO
后进先出LIFO
*/
//top为指针
#include <stdio.h>
#include <stdlib.h>
//常量定义最好用大写
#define STACK_INIT_SIZE 100//存储空间的初始分配量
#define STACKINCREMENT 10//存储空间的分配增量
typedef int SElemType;//定义SElemType名称来替代数据类型int
typedef struct{
SElemType *base;//存储空间基址
SElemType *top;//栈顶指针
int stacksize;//当前分配的储存容量,以元素为单位
}SqStack;//栈
//初始化栈
int InitSqStack(SqStack *S)
{
//分配100个数据的存储空间,并将空间的首地址存于S->base
S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
//判断空间分配是否成功,不成功返回0
if(!S->base) return 0;
//分配成功时给top,stacksize赋初值
S->stacksize=STACK_INIT_SIZE;
S->top=S->base;
return 1;
}
//入栈:将数据加入栈的栈顶,成功返回1 ,失败返回-1
int Push(SqStack *S,SElemType e)
{
SqStack *newStack;
//栈前检查空间是否够用
if((S->top-S->base)>=S->stacksize)
{
//扩容
newStack->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!newStack->base) return 0;
S->base=newStack->base;//将新的栈底指向扩容后的首地址
S->top=S->base+S->stacksize;//将新的栈顶位置设置成新栈底+当前栈中的元素个数的位置
S->stacksize+=STACKINCREMENT;//将当前栈可容纳的元素总个数更新为原来栈中数据及扩容的总和
}
//添加数据
*(S->top)=e;
//上移top指针
S->top++;
return 1;
}
//显示栈中的数据
void display(SqStack *S)
{
/*SqStack *p;
p=S->top-1;
if(S->base==S->top) return -1;
while(p!=S->base)
{
printf("%d ",&p);
p--;
}*/
SElemType *p;//定义一个与top相同数据类型的指针
p=S->top-1;
//判断是否为空栈
if(S->base==S->top) printf("空栈");
else
{
while(p>=S->base)
{
printf("%d ",*p);
p--;
}
}
}
//出栈
int pop(SqStack *S,SElemType *e)
{
if(S->base==S->top) printf("空栈");
else
{
S->top--;
*e=*(S->top);
}
return 1;
}
int main()
{
SqStack S;
int flag;
SElemType e;
flag=InitSqStack(&S);
if(flag==1)
{
printf("栈初始化成功!\n");
}
else
{
printf("栈初始化不成功!\n");
}
Push(&S,3);
Push(&S,15);
display(&S);
pop(&S,&e);
display(&S);
printf("当前出栈的值%d\n",e);
return 0;
}
网友评论