top初值设为-1,代表当前元素的下标值
//自定义的头文件
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype *data;
int maxlen;
int top;
}sqstack;
sqstack * Create_Sqstack(int len); //初始化
int is_empty_sqstack(sqstack *s); //判断是否为空
int is_full_sqstack(sqstack *s); //判断是否为满
void Clear_Sqstack(sqstack *s); //清空栈
void Push_Sqstack(sqstack *s, datatype value); //入栈
datatype Pop_Sqstack(sqstack *s); //出栈
datatype Gettop_Sqstack(sqstack *s); //去栈顶元素
void menu(void);
void Print_Sqstack(sqstack *s); //打印栈内容
//功能函数的实现
#include "sqstack.h"
sqstack * Create_Sqstack(int len)
{
sqstack *s;
if((s = (sqstack *)malloc(sizeof(sqstack))) == NULL)
{
printf("malloc failed!\n");
return NULL;
}
if((s->data = (datatype *)malloc(sizeof(sqstack) * len)) == NULL)
{
perror("malloc");
return NULL;
}
s->maxlen = len;
s->top = -1;
return s;
}
int is_empty_sqstack(sqstack *s)
{
return (s->top == -1 ? 1 : 0);
}
int is_full_sqstack(sqstack *s)
{
return (s->top == s->maxlen-1 ? 1 : 0);
}
void Clear_Sqstack(sqstack *s)
{
s->top = -1;
}
void Push_Sqstack(sqstack *s, datatype value)
{
if(s->top == s->maxlen-1)
{
printf("sqstack full!\n");
return ;
}
s->data[s->top+1] = value;
s->top++;
}
datatype Pop_Sqstack(sqstack *s)
{
s->top--;
return s->data[s->top+1];
}
datatype Gettop_Sqstack(sqstack *s)
{
return s->data[s->top];
}
void menu(void)
{
printf("-1 -> quit\n");
printf("0 -> menu\n");
printf("1 -> push\n");
printf("2 -> clear\n");
printf("3 -> pop\n");
printf("4 -> gettop\n");
printf("5 -> is_empty\n");
printf("6 -> is_full\n");
printf("7 -> print\n");
}
void Print_Sqstack(sqstack *s)
{
int top;
top = s->top;
while(top > -1)
{
printf("%d\t",s->data[top--]);
}
puts("");
}
//测试函数
#include "sqstack.h"
int main(int argc, char *argv[])
{
int choice;
sqstack *s;
int len;
datatype value;
menu();
s = Create_Sqstack(10);
while(1)
{
printf("please input function choice:\n");
scanf("%d",&choice);
switch(choice)
{
case -1:
exit(1);
case 0:
menu();
break;
case 1:
while(1)
{
printf("please input the data(-1 to quit):\n");
scanf("%d",&value);
if(value == -1)
{
break;
}
Push_Sqstack(s,value);
}
break;
case 2:
Clear_Sqstack(s);
break;
case 3:
value = Pop_Sqstack(s);
printf("the pop data is %d\n",value);
break;
case 4:
value = Gettop_Sqstack(s);
printf("the top data is %d\n",value);
break;
case 5:
if((len = is_empty_sqstack(s)) == 1)
printf("sqstack empty!\n");
else
printf("sqstack not empty!\n");
break;
case 6:
if((len = is_full_sqstack(s)) == 1)
printf("sqstack full!\n");
else
printf("sqstack not full!\n");
break;
case 7:
Print_Sqstack(s);
break;
}
}
free(s);
return 0;
}