1 数据结构_顺序栈
1.1 栈的定义
1)栈是一种只能在一段进行插入或删除操作的线性表,表中允许进行插入,删除操作的一段称为栈顶。表的另一端称为栈低。栈中没有数据被称为空栈。栈的插入操作常被称为压栈或进栈。栈的删除常被称为退栈或出栈。
2)栈的主要特点是“后进先出”,即先进栈的元素先弹出。栈也被称为后进先出表。
1.2 栈的顺序结构基本运算实现
假设栈的元素个数不超过正整数 MaxSize,所有元素都具有同一数据类型ElemType,则可以用一下方式定义顺序栈类型SqStack:
typedef struct
{
ElemType data[MaxSize];
int top; //栈顶指针
}SqStack; //定义顺序栈类型
(1)初始化栈InitStack(s)。
建立一个空栈s,实际上将栈顶指针指向-1即可。
void InitStack(SqStack * &s)
{
s = (SqStack *)malloc(sizeof(SqStack));
s->top = -1; //栈顶指针置为-1
}
(2)销毁栈 DestoryStack(s)。
释放栈s占用的内存。
void DestoryStack(SqStack * &s)
{
free(s);
}
(3)判断栈是否为空 StackEmpty(s)。
栈s为空的条件是s->top == -1。
bool StackEmpty(SqStack * s)
{
return (s -> top == -1);
}
(4)进栈Push(s,e)。
在栈不满的情况下,先将栈顶指针增1,然后在栈顶指针指向位置插入元素e。
bool Push(SqStack * &s,ElemType e)
{
if(s->top==MaxSize-1) //栈满的情况下,即栈溢出
return false;
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return ture;
}
(5)处栈Pop(s,e)。
在栈不为空的情况下,先将栈顶元素赋值给e,然后将栈顶指针减1。
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top == -1) //栈为空的情况下,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
s->top --; //栈顶自减1
return true;
}
(6)取栈顶元素 GetTop(s,e)。
在栈不为空的情况下将栈顶元素赋值给e。
bool GetTop(SqStack * s,ElemType &e)
{
if(s->top == -1)
return false;
e=s->data[s->top];
return true;
}
例题:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define MaxSize 5
typedef struct
{
ElemType data[MaxSize];
int top; //栈顶指针
}SqStack; //定义顺序栈类型
void InitStack(SqStack * &s)
{
s = (SqStack *)malloc(sizeof(SqStack));
s->top = -1; //栈顶指针置为-1
}
void DestoryStack(SqStack * &s)
{
free(s);
}
bool StackEmpty(SqStack * s)
{
return (s -> top == -1);
}
bool Push(SqStack * &s,ElemType e)
{
if(s->top==MaxSize-1) //栈满的情况下,即栈溢出
return false;
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if(s->top == -1) //栈为空的情况下,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶元素
s->top --; //栈顶自减1
return true;
}
int main()
{
int i,a,e;
SqStack *st;
InitStack(st);
for(i=0;i<MaxSize;i++)
{
scanf("%d",&a);
Push(st,a);
}
for(i=0;i<MaxSize;i++)
{
Pop(st,e);
printf("%5d",e);
}
DestoryStack(st);
putchar('\n');
system("pause");
return 0;
}