#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define EmptyTos -1
#define MinStackSize 5
//数组类型声明
struct Stack
{
int topOfStack; //栈顶角标,用于控制栈的有效数据范围
int capacity; //栈的容量
int* array; //指针,指向一维数组首元素的地址
};
//创建一个栈
struct Stack* createStack(int maxElements)
{
struct Stack* s;
if (maxElements < MinStackSize)
{
printf("stack size is too small.\n");
return NULL;
}
s = (struct Stack*)malloc(sizeof(struct Stack));
if (s == NULL)
{
printf("Out of space!\n");
return NULL;
}
s->array = (int*)malloc(sizeof(int)*maxElements);
if (s->array == NULL)
{
printf("Out of space!\n");
return NULL;
}
s->topOfStack = EmptyTos;
s->capacity = maxElements;
return s;
}
//判断是否为空栈
bool isEmpty(struct Stack* s)
{
return s->topOfStack == EmptyTos;
}
//判断栈是否为满
bool isFull(struct Stack* s)
{
return s->capacity == s->topOfStack + 1;
}
//打印栈中所有元素
void printStack(struct Stack* s)
{
int i;
for (i = 0; i < s->topOfStack + 1; i++)
{
printf("element is:%d\n", s->array[i]);
}
}
//释放栈内存
void disposeStack(struct Stack* s)
{
if (s != NULL)
{
free(s->array);
free(s);
}
}
//入栈
void push(int x, struct Stack* s)
{
if (isFull(s))
{
printf("full stack\n");
return;
}
else
{
s->array[++s->topOfStack] = x;
}
}
//查看栈顶元素,并返回元素值
int top(struct Stack* s)
{
if (!isEmpty(s))
{
return s->array[s->topOfStack];
}
printf("empty stack\n");
return 0;
}
//出栈
void pop(struct Stack* s)
{
if (isEmpty(s))
{
printf("empty stack\n");
return;
}
else
{
s->topOfStack--;
}
}
//返回栈顶值并出栈
int topAndPop(struct Stack* s)
{
if (!isEmpty(s))
{
return s->array[s->topOfStack--];
}
printf("empty stack\n");
return 0;
}
//清空栈
void makeEmpty(struct Stack* s)
{
s->topOfStack = EmptyTos;
}
//主函数
int main(void)
{
int val;
struct Stack* s;
//创建一个栈
s = createStack(10);
//压栈
push(5, s);
push(2, s);
push(3, s);
//显示栈中的元素值
printStack(s);
printf("===========================\n");
//查看栈顶元素值
val = top(s);
printf("top val is:%d\n", val);
printf("===========================\n");
//栈顶元素出栈
pop(s);
pop(s);
//查看栈顶元素,并返回元素值
val = top(s);
printf("top val is:%d\n", val);
printf("===========================\n");
//压栈
push(6, s);
push(7, s);
//显示栈中的元素值
printStack(s);
printf("===========================\n");
//返回栈顶值并出栈
val=topAndPop(s);
printf("val=%d\n",val);
//显示栈中的元素值
printStack(s);
printf("===========================\n");
//判断栈是否为满
val=isFull(s);
printf("val=%d\n", val);
printf("===========================\n");
//清空栈
makeEmpty(s);
printf("stack isEmpty:%d\n", isEmpty(s));
//如果栈不在使用,则释放栈内存
disposeStack(s);
}