记录作业,以后当模板用
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5 //设置栈的最大容量
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
typedef int elemtype;
typedef int Status; ////用作返回函数的执行状态,成功返回OK(1),失败返回(0)
//这是栈的结构定义,包含两个成员,一是用了储存栈的数组,二是代表栈顶指针的top
typedef struct{
elemtype date[MAXSIZE];
int top;
}SqStack;
Status Push(SqStack *s,elemtype e);
Status Pop(SqStack *s,elemtype *e);
void InitStack(SqStack *s);
void PrintStack(SqStack *s);
void ClearStack(SqStack *s);
int StackEmpty(SqStack *s);
Status GetTop(SqStack *s,elemtype *e);
int StackLength(SqStack *s);
int main()
{
elemtype temp;//定义一个临时变量,用于返回元素值
SqStack S1;//声明一个栈S1
SqStack *s1=&S1;//定义一个指向栈的指针s1
InitStack(s1);//现在我们初始化这个栈
PrintStack(s1);//由于此时栈为空,因此会打印出来一个NULL
//进行压栈操作,因为栈的最大容量为5,因此在第六次操作时会返回一个ERROR,同时压栈失败
if(Push(s1,1)==ERROR) printf("ERROR\n");
if(Push(s1,2)==ERROR) printf("ERROR\n");
if(Push(s1,3)==ERROR) printf("ERROR\n");
if(Push(s1,4)==ERROR) printf("ERROR\n");
if(Push(s1,5)==ERROR) printf("ERROR\n");
if(Push(s1,6)==ERROR) printf("ERROR\n");
//打印一下看看,是不是上面所压栈的数字1~5
PrintStack(s1);
//弹栈操作,同时打印出弹出的元素,如果栈为空,那么会弹栈失败并打印出一个ERROR
if(Pop(s1, &temp)) printf("%d\n",temp);
else printf("ERROR\n");
if(Pop(s1, &temp)) printf("%d\n",temp);
else printf("ERROR\n");
if(Pop(s1, &temp)) printf("%d\n",temp);
else printf("ERROR\n");
if(Pop(s1, &temp)) printf("%d\n",temp);
else printf("ERROR\n");
if(Pop(s1, &temp)) printf("%d\n",temp);
else printf("ERROR\n");
if(Pop(s1, &temp)) printf("%d\n",temp);//果然第六次弹栈不会成功的
else printf("ERROR\n");
//重新压进三个元素,用于验证其它操作
if(Push(s1,10)==ERROR) printf("ERROR\n");
if(Push(s1,11)==ERROR) printf("ERROR\n");
if(Push(s1,12)==ERROR) printf("ERROR\n");
printf("StackLength:%d\n",StackLength(s1));//打印栈的长度,果然是3
if(GetTop(s1, &temp)) printf("%d\n",temp);//返回一下栈顶元素并打印,与弹栈不同的是不会将栈顶元素弹出
else printf("ERROR\n");
if(StackEmpty(s1)) printf("Empty\n");//测试栈是否为空,因为栈中还有三个元素,此处打印出了Not Empty
else printf("Not Empty\n");
ClearStack(s1);//清空这个栈
if(StackEmpty(s1)) printf("Empty\n");//清空后这个栈又重新变成了空的
else printf("Not Empty\n");
return 0;
}
//初始化栈S的空间,创建一个空栈
void InitStack(SqStack *s)
{
int i;
s->top=0;
for(i=0;i<MAXSIZE;i++)
{
s->date[i]=0;
}
}
//打印栈S中的所有元素,用于验证各项操作是否成功
void PrintStack(SqStack *s)
{
int i;
if(s->top == 0)
{
printf("NULL\n");
return;
}
for(i=0;i<=s->top-1;i++)
{
printf("%d ",s->date[i]);
}
printf("\n");
}
//若栈S存在,插入新元素e到栈S中并成为栈顶元素
Status Push(SqStack *s,elemtype e)
{
if(s->top == MAXSIZE)
{
return ERROR;
}
s->date[s->top]=e;
s->top++;
return OK;
}
//弹出栈S中的栈顶元素,并用e返回其值
Status Pop(SqStack *s,elemtype *e)
{
if(s->top == 0)
{
return ERROR;
}
*e=s->date[s->top-1];
s->top--;
return OK;
}
//将栈S清空
void ClearStack(SqStack *s)
{
int i;
s->top=0;
for(i=0;i<MAXSIZE;i++)
{
s->date[i]=0;
}
}
//测试栈S是否为空
int StackEmpty(SqStack *s)
{
if(s->top==0)
{
return TURE;
}
else
{
return FALSE;
}
}
//若栈S存在且非空,用e返回S的栈顶元素
Status GetTop(SqStack *s,elemtype *e)
{
if(s->top==0)
{
return ERROR;
}
else
{
*e=s->date[s->top-1];
}
return OK;
}
//返回栈S的元素个数
int StackLength(SqStack *s)
{
return s->top;
}