栈的顺序储存结构的c语言实现
顺序栈的基本定义
栈是一种特殊的线性表,栈是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构
栈的顺序储存结构简称为顺序栈,顺序栈是利用一组地址连续的存储单元依次存放栈底到栈顶的数据元素,栈底位置固定不变,栈顶位置随着入栈和出栈操作而变化。栈顶指针top等于零时,代表栈中有一个元素,因此通常把空栈的判定条件定为top等于-1.
顺序栈的基本操作
结构体声明
#define MAXSIZE 100
typedef int elemtype;
typedef struct Sqstack
{
elemtype data[MAXSIZE]; //数据数组
int top; //栈顶指针
}Sqstack;
初始化函数
void InitStack(Sqstack *S) //初始化函数
{
S->top = -1; //使栈顶指针top为-1 ,表示栈为空
}
top等于-1表示栈为空
进栈的函数
void Push(Sqstack *S, elemtype e) //进栈函数,e为新加入栈顶的元素
{
if (S->top == MAXSIZE - 1) //如果栈已经满了
{
printf("栈已满!");
return;
}
S->top++; //使栈顶指针top加1
S->data[S->top] = e; //将新元素e加入
}
出栈的函数
void Pop(Sqstack *S, elemtype *e) //出栈函数
{
if (S->top == -1) //如果当前栈为空,就返回
{
printf("栈已为空,无法出栈!\n");
return;
}
*e = S->data[S->top]; //将出栈的元素通过e返回
S->top--; //使栈顶指针减1
}
打印出该栈
void ShowStack(Sqstack *S) //打印该栈
{
int i;
i = S->top;
if (S->top == -1)
{
printf("当前栈为空!\n");
}
else
{
while (S->top != -1)
{
printf("栈元素为:%d\n", S->data[S->top]);
(S->top)--;
}
}
S->top = i; //将原先的top指针还原
}
注意此函数当栈顶指针top循环后一定要在最后使它回到栈顶位置
求栈的长度
int StackLength(Sqstack *S) //返回栈的元素个数
{
return S->top + 1;
}
求栈顶元素
void GetTop(Sqstack *S, elemtype *e) //得到栈顶的元素,用e返回
{
if (S->top == -1)
{
printf("该栈为空!");
return;
}
*e = S->data[S->top]; //将栈顶元素赋值给e
}
到此,顺序表的基本操作已经完成,下面附上源码
源码:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int elemtype;
typedef struct Sqstack
{
elemtype data[MAXSIZE]; //数据数组
int top; //栈顶指针
}Sqstack;
void InitStack(Sqstack *S) //初始化函数
{
S->top = -1; //使栈顶指针top为-1 ,表示栈为空
}
void Push(Sqstack *S, elemtype e) //进栈函数,e为新加入栈顶的元素
{
if (S->top == MAXSIZE - 1) //如果栈已经满了
{
printf("栈已满!");
return;
}
S->top++; //使栈顶指针top加1
S->data[S->top] = e; //将新元素e加入
}
void Pop(Sqstack *S, elemtype *e) //出栈函数
{
if (S->top == -1) //如果当前栈为空,就返回
{
printf("栈已为空,无法出栈!\n");
return;
}
*e = S->data[S->top]; //将出栈的元素通过e返回
S->top--; //使栈顶指针减1
}
void ShowStack(Sqstack *S) //打印该栈
{
int i;
i = S->top;
if (S->top == -1)
{
printf("当前栈为空!\n");
}
else
{
while (S->top != -1)
{
printf("栈元素为:%d\n", S->data[S->top]);
(S->top)--;
}
}
S->top = i; //将原先的top指针还原
}
int StackLength(Sqstack *S) //返回栈的元素个数
{
return S->top + 1;
}
void GetTop(Sqstack *S, elemtype *e) //得到栈顶的元素,用e返回
{
if (S->top == -1)
{
printf("该栈为空!");
return;
}
*e = S->data[S->top]; //将栈顶元素赋值给e
}
int main()
{
Sqstack Sq;
elemtype m;
InitStack(&Sq);
Push(&Sq, 12);
Push(&Sq, 49);
Push(&Sq, 43);
Push(&Sq, 5);
Push(&Sq, 9);
Push(&Sq, 22);
ShowStack(&Sq);
Pop(&Sq, &m);
printf("栈顶被删除元素为:%d\n", m);
Pop(&Sq, &m);
printf("栈顶被删除元素为:%d\n", m);
ShowStack(&Sq);
printf("当前栈中元素个数为%d\n", StackLength(&Sq));
GetTop(&Sq, &m);
printf("栈顶元素为:%d\n", m);
system("pause");
return 0;
}