栈的顺序存储结构

记录作业,以后当模板用

#include 
#include 

#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;idate[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;idate[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;
}

你可能感兴趣的:(栈)