栈(Stack)定义
限定在一端进行插入和删除的线性表
特性
(Last In First Out, LIFO)后进先出表
图示及术语
栈:
栈顶top:插入/删除
栈底bottom:另一端
栈顶移动,栈底固定
入栈(压栈)push
出栈(弹栈)pop
顺序栈(Array-based Stack )
—— 用顺序存储结构实现的栈
用一组内存地址连续的存储单元,
自栈底到栈顶依次存放数据元素
栈底:固定的,习惯上放在数组下标小的那端
栈顶:变化的,设整型变量 top 指示栈顶位置
入栈:top ++ ;出栈:top --
源代码:
#pragma warning( disable : 4996)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ElemType char
#define _CRT_SECURE_NO_WARNINGS
//定义一个数据结构
typedef struct
{
ElemType *data;//存储数据
int top;
int size;
}Sepstack, *pSepstack;
void Creat_stack_init(pSepstack s, int len)//初始化栈
{
s->data = (ElemType *)malloc(len * sizeof(ElemType));
if (s->data == NULL)
{
printf("内存分配失败");
}
else
{
s->size = len;
s->top = -1;
}
}
void push_stack(pSepstack s, ElemType datas)//压入栈
{
if (s->top == s->size - 1)
{
printf("栈满了");
}
else
{
s->top++;
s->data[s->top] = datas;
}
}
void pop_stack(pSepstack s, ElemType *datas,int n)//弹出栈
{
datas = (ElemType *)malloc(n*sizeof(ElemType));
if (s->top ==-1)
{
printf("栈空");
}
else
{
for (int i = 0; i < 6;)
{
datas[i] = s->data[s->top];
s->top--;
i++;
}
}
printf("观察栈弹出数据:\n");
for (int j= 0; j < 6;)
{
printf("%c\n", datas[j]);
j++;
}
}
void Seq_Print(pSepstack s)//输出栈数据
{
printf("输出栈数据:\n");
for (int i = 0; i <= s->size-1;)
{
printf("%c\n", s->data[i]);
i++;
}
printf("\n");
}
Sepstack s1 ;
//判断栈是否为空
void seq_isempty(pSepstack s)
{
if (s->top ==- 1)
{
printf("栈为空\n");
}
else
{
printf("栈不为空\n");
}
}
//搜索栈中元素
void seq_search(pSepstack s, ElemType datas)
{
while (s->data[s->top] != datas)
{
s->top--;
}
printf("搜索栈中元素:%c:\n", s->data[s->top]);
}
//清空栈
void seq_clearn(pSepstack s)
{
s->top = -1;
}
int main()
{
ElemType *p=NULL;
char s2 = 0;
Creat_stack_init(&s1, 6);
push_stack(&s1, '1');
push_stack(&s1, '2');
push_stack(&s1, '3');
push_stack(&s1, '4');
push_stack(&s1, '5');
push_stack(&s1, '6');
seq_isempty(&s1);//判断栈是否为空
pop_stack(&s1,p,6);
printf("\n");
Seq_Print(&s1);
//搜索栈中为4的原属
seq_search(&s1,'4');
//判断是否清空栈
seq_clearn(&s1);
seq_isempty(&s1);
system("pause");
return 0;
}