目录
顺序栈的定义
SElemYType代表着任意的数据类型,比如int,char,float之类的。我们可以根据具体情况代换,这里我是用typedef语句将SElemType表示为int。typedef int SElemType;
。
在SqStack结构体中,我们定义了两个指针top和base分别指向栈顶和栈底,定义了一个int变量来存储栈的最大容量。
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
初始化
使用malloc函数分配maxsize大小的空间,并让base指针指向这片空间。让top指针等于base指针,这时代表空栈。
int InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
if(!S->base)
exit(OVERFLOW);
S->top = S->base;
S->stacksize = MAXSIZE;
return OK;
}
入栈
入栈第一步要判断现在top指针减去base指针是否等于栈的最大容量,如果是的话直接退出函数。也许大家不懂*S->top
是什么意思,S->top是一个指针,*S->top代表的就是这个地址存储的数值。
int Push(SqStack *S,SElemType e)
{
if(S->top - S->base == S->stacksize)
return ERROR; //栈满
*S->top = e;
S->top++;
return OK;
}
遍历栈的元素
为了能够更好的查看我们的函数对于栈中元素的操作,我写了这个遍历函数。注意这个函数是从栈底开始遍历栈中元素的。
int StackTraverse(SqStack *S)
{
SElemType *p;
p=S->base;
while(p!=S->top)
{
printf("%d\n",*p);
p++;
}
return OK;
}
出栈
出栈的流程于入栈刚好相反。在取出栈顶元素之前要判断栈是否为空。
int Pop(SqStack *S,SElemType *e)
{
if(S->top == S->base)
return ERROR; //栈空
e = S->top;
S->top--;
return OK;
}
取栈顶元素
取栈顶元素只需要把top指针指向的元素返回就行。
SElemType GetTop(SqStack *S)
{
if(S->top != S->base)
return *S->top;
}
获取栈的长度
栈的长度为栈顶指针减去栈底指针。
int StackLength(SqStack *S)
{
int length;
length = S->top-S->base;
return length;
}
清空栈
清空栈只需要将栈底指针定于栈顶指针即可。
int ClearStack(SqStack *S)
{
S->top = S->base;
return OK;
}
完整代码
#include<stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int SElemType; //根据需要定义SElemType的数据类型
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
int InitStack(SqStack *S);
int Push(SqStack *S,SElemType e);
int StackTraverse(SqStack *S);
int Pop(SqStack *S,SElemType *e);
SElemType GetTop(SqStack *S);
int StackLength(SqStack *S);
int ClearStack(SqStack *S);
int main()
{
SqStack S;
InitStack(&S);
int e;
int length;
int cnt=5;
/*我这里是为了图省事,没想到更好的循环结束的条件,
直接使用5次push函数创建一个栈方便后续操作,大家明白就好
*/
while(cnt)
{
scanf("%d",&e);
Push(&S,e);
cnt--;
}
printf("-----------\n");
StackTraverse(&S);
length = StackLength(&S);
printf("length:%d\n",length);
printf("-----------\n");
Pop(&S,&e);
printf("出栈元素的值:%d\n",e);
StackTraverse(&S);
printf("-----------\n");
e=GetTop(&S);
printf("栈顶元素的值:%d\n",e);
return 0;
}
int InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
if(!S->base)
exit(OVERFLOW);
S->top = S->base;
S->stacksize = MAXSIZE;
return OK;
}
int Push(SqStack *S,SElemType e)
{
if(S->top - S->base == S->stacksize)
return ERROR; //栈满
*S->top = e;
S->top++;
return OK;
}
int StackTraverse(SqStack *S)
{
SElemType *p;
p=S->base;
while(p!=S->top)
{
printf("%d\n",*p);
p++;
}
return OK;
}
int Pop(SqStack *S,SElemType *e)
{
if(S->top == S->base)
return ERROR; //栈空
e = S->top;
S->top--;
return OK;
}
SElemType GetTop(SqStack *S)
{
if(S->top != S->base)
return *S->top;
}
int StackLength(SqStack *S)
{
int length;
length = S->top-S->base;
return length;
}
int ClearStack(SqStack *S)
{
S->top = S->base;
return OK;
}