栈是一种受限制的线性表,说其受限制是因为它的
插入和删除只能在栈顶操作
。
运行界面:
栈的特性是
后进先出,所以也将栈称为后进先出(
LIFO)表。
栈的顺序存储也称为线性栈,是利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。用栈顶指针top来标识栈顶元素在顺序栈中的位置。
栈的结构体表示:
typedef struct
{
int data[MAXNUM]; //存储数据的数组
int top; //指向栈顶元素,在数组中相当下标
}seqstack;
插入元素操作:
需先将top指针指向栈顶上面的空位,然后再进行赋值。
void Push(seqstack *stack,int val)
{
if(stack->top >= MAXNUM-1)
{
printf("栈已满!\n");
return ;
}
stack->top++; //top指针先指向栈顶上面的空位
stack->data[stack->top] = val;//将数据元素入栈,成为新的栈顶元素
}
删除元素操作:
将top指针向下移动,指向新的栈顶元素
int Pop(seqstack *stack)
{
if(!IsEmpty(stack))
return stack->data[stack->top--]; //弹出栈顶元素,并且栈顶指针向下一位
return 0;
}
顺序栈的C语言实现:(codeblocks完美运行)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUM 100
typedef struct
{
int data[MAXNUM]; //存储数据的数组
int top ; //指向栈顶元素,在数组中相当下标
}seqstack;
//初始化顺序栈
void Initstack(seqstack *stack)
{
memset(stack->data,0,MAXNUM);
stack->top = -1;
}
//判断栈是否为空,是返回1,否则返回0
int IsEmpty(seqstack *stack)
{
if(stack->top == -1)
return 1;
else
{
return 0;
}
}
//返回栈顶指针指向的元素
int Top(seqstack *stack)
{
if(!IsEmpty(stack))
return stack->data[stack->top];
return 0;
}
//出栈
int Pop(seqstack *stack)
{
if(!IsEmpty(stack))
return stack->data[stack->top--]; //弹出栈顶元素,并且栈顶指针向下一位
return 0;
}
//入栈
void Push(seqstack *stack,int val)
{
if(stack->top >= MAXNUM-1)
{
printf("栈已满!\n");
return ;
}
stack->top++; //top指针先指向栈顶上面的空位
stack->data[stack->top] = val;//将数据元素入栈,成为新的栈顶元素
}
void destroy_stack(seqstack *stack)
{
if(!IsEmpty(stack))
free(stack);
else
{
printf("栈已为空!\n");
return ;
}
}
int main()
{
int i;
srand((unsigned)time(0));
seqstack stack; //创建一个顺序栈
Initstack(&stack);
for(i=0;i<30;i++)
Push(&stack,rand()%100); //创建30个0-99的随记数,并入栈
printf("栈顶元素为:%d\n",Top(&stack));
printf("打印栈顶元素:\n");
for(i=0;i<30;i++)
{
if(i%6 == 0)
printf("\n");
printf("%3d ",Pop(&stack));
}
printf("\n销毁栈!\n");
destroy_stack(&stack);
return 0;
}
运行界面: