基本操作
顺序栈储存结构
typedef struct
{
int *top;
int *base;
int stacksize;
} SqStack;
初始化顺序栈
Status InitStack(SqStack *s)
{
(*s).base = (SElemType *)malloc(MAXSIZE);
if(!(*s).base) return ERROR;
(*s).top = (*s).base;
(*s).stacksize = MAXSIZE;
return OK;
}
判断顺序栈是否为空
Status isEmpty(SqStack s)
{
if(s.base == s.top) return TRUE;
return FALSE;
}
顺序栈的长度
int StackLength(SqStack s)
{
return s.top-s.base;
}
清空顺序栈
Status clearStack(SqStack *s)
{
if((*s).base == NULL) return ERROR;
(*s).top = (*s).base;
return OK;
}
销毁顺序栈
Status destroyStack(SqStack *s)
{
if((*s).base == NULL) return ERROR;
free((*s).base);
(*s).stacksize = 0;
(*s).base = (*s).top = NULL;
return OK;
}
压栈n个元素
Status pushElems(SqStack *s,int n)
{
int i;
if((*s).base == NULL) return ERROR;
if(((*s).top - (*s).base) == (*s).stacksize) return ERROR;
printf("请输入压栈的%d个元素: ",n);
for(i=0;i<n;i++)
{
scanf("%d",(*s).top);
(*s).top++;
}
return OK;
}
入栈
Status push(SqStack *s,SElemType e)
{
if((*s).base == (*s).MAXSIZE) return ERROR;
*((*s).top)++=e;
return OK;
}
出栈
Status pop(SqStack *s,SElemType *e)
{
if((*s).base == (*s).top) return ERROR;
*e = *-- (*s).top;
return OK;
}
遍历
void show(SqStack s)
{
printf("当前顺序栈情况: ");
for(s.top = s.top-1;s.top>=s.base;s.top--)
printf("%d ",*(s.top));
printf("\n");
}
测试代码整合
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
typedef struct
{
int *top;
int *base;
int stacksize;
} SqStack;
Status InitStack(SqStack *s)
{
(*s).base = (SElemType *)malloc(MAXSIZE);
if(!(*s).base) return ERROR;
(*s).top = (*s).base;
(*s).stacksize = MAXSIZE;
return OK;
}
Status pushElems(SqStack *s,int n)
{
int i;
if((*s).base == NULL) return ERROR;
if(((*s).top - (*s).base) == (*s).stacksize) return ERROR;
printf("请输入压栈的%d个元素: ",n);
for(i=0;i<n;i++)
{
scanf("%d",(*s).top);
(*s).top++;
}
return OK;
}
Status isEmpty(SqStack s)
{
if(s.base == s.top) return TRUE;
return FALSE;
}
Status clearStack(SqStack *s)
{
if((*s).base == NULL) return ERROR;
(*s).top = (*s).base;
return OK;
}
Status destroyStack(SqStack *s)
{
if((*s).base == NULL) return ERROR;
free((*s).base);
(*s).stacksize = 0;
(*s).base = (*s).top = NULL;
return OK;
}
int StackLength(SqStack s)
{
return s.top-s.base;
}
Status push(SqStack *s,SElemType e)
{
if((*s).base == (*s).MAXSIZE) return ERROR;
*((*s).top)++=e;
return OK;
}
Status pop(SqStack *s,SElemType *e)
{
if((*s).base == (*s).top) return ERROR;
*e = *-- (*s).top;
return OK;
}
void show(SqStack s)
{
printf("当前顺序栈情况: ");
for(s.top = s.top-1;s.top>=s.base;s.top--)
printf("%d ",*(s.top));
printf("\n");
}
int main()
{
SqStack S;
SElemType e;
InitStack(&S);
printf("-------为初始化的栈压入数据-------\n");
pushElems(&S,5);
show(S);
printf("\n-------顺序栈是否为空?---------\n");
if(isEmpty(S)) printf("空栈\n");
else printf("非空栈\n");
printf("\n-------顺序栈的长度--------\n顺序栈的长度:%d\n",StackLength(S));
printf("\n-------顺序栈入栈-----------\n");
push(&S,10);
show(S);
printf("\n-------顺序栈出栈-----------\n");
pop(&S,&e);
printf("出栈元素:%d\n",e);
show(S);
printf("\n-------清空顺序栈----------\n");
clearStack(&S);
if(isEmpty(S)) printf("空栈\n");
else printf("非空栈\n");
printf("\n-------销毁顺序栈----------\n");
destroyStack(&S);
if(!S.base) printf("栈不存在~\n");
}