数据结构——顺序栈(动态分配空间)的基本操作

代码主要来源:【数据结构】【清华大学】【严蔚敏】
顺序栈S的基本运算如下:
(1)初始化栈S
(2)栈为空
(3)依次进栈元素a,b,c,d,e
(4)栈为非空
(5)出栈序列:e d c b a
(6)栈为空
(7)释放栈

完整代码如下:

#include <stdio.h>
#include <stdlib.h> 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1 
#define OVERFLOW -1
#define ERROR 0

typedef int SElemType;
typedef int Status;

typedef struct Stack{
	SElemType *top;
	SElemType *base;
	int  stacksize;
}SqStack; 


Status InitStack(SqStack &S)
{
	S.base=((SElemType*)malloc(sizeof(SqStack)*STACK_INIT_SIZE));
	if(!S.base) exit(-1);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
} 

Status Push(SqStack &S, SElemType e)//插入栈顶元素操作 
{
    if(S.top-S.base>=S.stacksize) //判断栈满,若满则追加存储空间
    {
        S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)
            exit(OVERFLOW); 
        S.top=S.base+S.stacksize;//  S.top指向新的S.base+S.stacksize(也有可能S.base没变) 
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;  //先赋值然后位置再加一 
    return OK;
}

Status Pop(SqStack &S,SElemType &e)
{
    if(S.top==S.base)//栈顶和栈顶指向同一个存储空间则栈满了 
        return ERROR;
    e=*--S.top;  //指针位置先减一再赋值 
    return OK;
}


Status GetTop(SqStack S,SElemType &e)//返回栈顶元素,不删除 
{
    if(S.top>S.base)
    {
        e=*(S.top-1);
        return OK;
    }
    else
        return ERROR;
}

Status StackEmpty(SqStack S)
{
    if(S.top==S.base)
        return 1;
    else
        return 0;
}

Status DestroyStack(SqStack &S)
{
    free(S.base);
    S.base=S.top=NULL; 
    S.stacksize=0;
    return OK;
}


int main()
{
	char a[5]={'a','b','c','d','e'};
	SqStack s1;
	int i,e1;
	InitStack(s1);
	if(InitStack(s1))
	{
		printf("初始化成功!\n"); 
	}
	if(StackEmpty(s1))
	{
		printf("此时栈为空\n"); 
	}
	printf("依次进栈元素:a,b,c,d,e\n"); 
	for(i=0;i<5;i++)
	{
		Push(s1,a[i]);
	}
	if(!StackEmpty(s1))
	{
		printf("此时栈非空\n"); 
	}
	printf("出栈序列为:"); 
	while(!StackEmpty(s1))
	{
		Pop(s1,e1);
		printf("%c ",e1);
	 } 
	if(StackEmpty(s1))
	{
		printf("\n此时栈为空\n"); 
	}
	if(DestroyStack(s1))
	{
		printf("释放栈成功!\n"); 
	}
}


猜你喜欢

转载自blog.csdn.net/qq_41856733/article/details/83962017