栈的逻辑结构是一种后进先出(first in last out)的线性表,把栈中元素存入内存中可以采用顺序存储结构和链式存储结构。这里采用顺序存储结构实现。这样的栈叫做顺序栈。C语言中我们利用数组这种数据类型实现在内存中开辟一段连续空间,用来保存栈中元素。
栈只提供对它栈顶元素的操作。因此,栈是只在一端进行插入删除的线性表。
栈的最核心操作:入栈(Push)将一个新值压入栈顶。 出栈(Pop) 将栈顶元素的值移出栈并返回这个值,这种方案的不利之处在于当想访问栈顶元素时只能Pop,这样会改变栈的状态。
因此,我们可以改进接口的设计: 入栈(Push)不变, 出栈(Pop)单纯的是出栈,另外添加一个接口(Top)专门用于获取栈顶元
素。Top的优点在于它可以反复访问栈顶元素,而不改变栈的状态。
一个空栈不能执行出栈(Pop)操作, 一个满栈不能执行插入操作。因此,我们还需要一个函数用于告诉我们栈满否(is_full)
一个函数告诉我们栈空否(is_empty).
因此,栈的接口设计方案:
void Push(Stack_Type value); //入栈
void Pop(void);//出栈
Stack_Type Top(void); //获取栈顶元素
int is_full(void);//判断栈满否, 若满,返回1,否则返回0
int is_empty(void); //判断栈空否。若空,返回,否则返回0
#include<stdio.h>
#include<stdlib.h>
//自定义栈中元素类型
#define STACK_TYPE int
//自定义栈大小
#define STACK_SIZE 100
//定义静态数组,作为存储栈元素的容器
static STACK_TYPE stack[STACK_SIZE];
//利用数组下标记录栈顶位置, 定义指针,指向当前栈顶,初始时栈空。
static int top_element = -1;
//栈满否,若满,返回1,否则返回0
int is_full(void)
{
//top_element为静态数组的栈顶元素的下标。
if(top_element == STACK_SIZE -1)
return 1;
else
return 0;
}
//栈空否,若空,返回1,否则返回0
int is_empty(void)
{
if(top_element == -1)
return 1;
else
return 0;
}
//入栈
void Push(STACK_TYPE value)
{
//栈未满时,才能入栈操作
if(!is_full())
{
top_element++;
stack[top_element] = value;
}
}
//出栈
void Pop(void)
{
//栈未空时,才能出栈操作
if(!is_empty())
{
top_element--;
}
}
//获取栈顶元素
STACK_TYPE Top(void)
{
return stack[top_element];
}
//测试
int main(void)
{
//入栈
Push(1);
Push(2);
printf("%d ",Top());
Pop();
printf("%d ", Top());
system("pause");
return 0;
}