以下是头文件:
#pragma once
#ifndef __LIST_H__
#define __LIST_H__
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>
#endif
以下是代码实现:
#include "list.h"
#define STACK_INIT_SIZE 10 //初始大小
#define STACK_ADD 5 //增量
enum position { ERROR, OK, OVERFLOW=-2}; //0 1 -2
typedef int SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stack_size; //已分配的存储空间
}SqStack, *pStack;
int SqStack_Init(SqStack* stack); //创建
int SqStack_Clear(SqStack* stack); //清空
int SqStack_Push(SqStack* stack, const SElemType item); //压栈
SElemType SqStack_Pop(SqStack* stack); //出栈
SElemType SqStack_Top(const SqStack* stack); //获取栈顶元素
int SqStack_Size(const SqStack* stack); //当前大小
int SqStack_Capacity(const SqStack* stack); //当前容量
void SqStack_Print(const SqStack* stack); //打印出栈各个元素
//int main()
//{
// printf("------------------顺序栈测试------------------\n");
// test6();
// //printf("\n%d\n", OVERFLOW);
// system("pause");
// return 0;
//}
void test6()
{
SqStack p;
pStack stack = &p;
SqStack_Init(stack);
SqStack_Push(stack, 1); SqStack_Push(stack, 2); SqStack_Push(stack, 3);
SqStack_Print(stack);
printf("SqStack_Top:%d\n", SqStack_Top(stack));
printf("SqStack_Size:%d\n", SqStack_Size(stack));
printf("SqStack_Capacity:%d\n", SqStack_Capacity(stack));
SqStack_Pop(stack);
printf("一次出栈操作后:\n");
SqStack_Print(stack);
}
int SqStack_Init(SqStack* stack)
{
assert(stack);
stack->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (stack->base == NULL)
{
exit(EOVERFLOW);
}
stack->top = stack->base;
stack->stack_size = STACK_INIT_SIZE;
return OK;
}
int SqStack_Clear(SqStack* stack)
{
assert(stack);
stack->top = stack->base;
return OK;
}
int SqStack_Push(SqStack* stack, const SElemType item)
{
assert(stack); //判断seql是否有效
if (stack->top - stack->base >= stack->stack_size)
{
if (!(stack->base = (SElemType *)realloc(stack->base, (stack->stack_size + STACK_ADD) * sizeof(SqStack))))
{
exit(OVERFLOW);//分配失败
}
stack->top = stack->base + stack->stack_size;
stack->stack_size = stack->stack_size + STACK_ADD;
}
*stack->top++ = item;
return OK;
}
SElemType SqStack_Pop(SqStack* stack)
{
assert(stack);
if (stack->top == stack->base)
{
exit(OVERFLOW);
}
return *(--stack->top);
}
SElemType SqStack_Top(const SqStack* stack)
{
assert(stack);
SElemType *temp = stack->top;
return *(--temp);
}
void SqStack_Print(const SqStack* stack)
{
assert(stack);
SElemType *temp = NULL;
temp = stack->top;
while (temp != stack->base)
{
printf("%d ", *(--temp));
}
printf("\n");
}
int SqStack_Size(const SqStack* stack)
{
assert(stack);
return stack->top - stack->base;
}
int SqStack_Capacity(const SqStack* stack)
{
assert(stack);
return stack->stack_size;
}