1.栈是一种线性表,主要特点就是只允许在一端进行插入或删除操作的线性表。
2.栈顶:(top)线性表允许进行插入和删除的一端
栈底:(bottom) 是固定的,不允许进行插入和删除的一端
采用顺序存储的栈被称为“顺序栈”,通常顺序存储结构由一个“一维数组”和一个记录“栈顶”元素位置的变量组成。
1.结构定义
#define MaxSize 100
typedef int Elemtype;
//顺序栈的结构
typedef struct {
Elemtype data[MaxSize]; //存放栈中的元素
int top; //栈顶指针
}SequenStack;
SequenStack S;
栈顶指针:S.top ,初始时设置S.top=-1;
栈顶元素:S.data[S.top];
进栈操作(Push):栈不满时,栈顶指针先加1,再送值到栈顶元素
出栈操作(Pop):栈非空时,先取栈顶元素值,再将栈顶指针减1。
栈空条件:S.top==-1;
栈满条件:S.top==MaxSize-1;
2.初始化
void InitStack(SequenStack &S) //使用&可以修改传入的S栈的内容
{
S.top = -1;
}
3.判断栈是否为空
bool StackEmpty(SequenStack S)
{
if (S.top == -1) { //栈空
return true;
}
else {
return false; //不空
}
}
4.Push入栈操作
bool Push(SequenStack &S, Elemtype x)
{
if (S.top == MaxSize - 1) //栈满,报错
{
return false;
}
//先让top加1然后给加1后的地址位置附上x值
//相当于 S.top++; S.data[S.top]=x;
S.data[++S.top] = x;
return true;
}
5.Pop出栈操作
第一种是修改参数x的值
bool Pop(SequenStack &S, Elemtype &x)
{
if (S.top == -1) //栈空
return false;
//将出栈的值给x,然后top减1
x=S.data[S.top--];
return true; //虽然返回的是bool类型,但是参数中x是地址,那么在Pop函数中修改x可以在程序中输出
}
第二中是返回的值是出栈的值
Elemtype Pop(SequenStack &S)
{
if (S.top == -1) //栈空
return false;
//将出栈的值给x,然后top减1
return S.data[S.top--];
}
6.读取栈顶元素
bool GetTop(SequenStack S, Elemtype &x)
{
if (S.top == -1) //栈空
return false;
x = S.data[S.top]; //与出栈的区别是不需要移动top
return true;
}
分析:使两个栈分别从数组的两头开始向中间扩展,当两个栈的栈顶指针相遇时,表示两个栈都满了。
1.共享栈的结构
#define MaxSize 100
typedef int Elemtype;
typedef struct {
Elemtype data[MaxSize];
int top; //数组下标
int top1;
};
DStack S;
2.初始化
void InitDStack(DStack &S)
{
S.top = -1;
S.top1 = MaxSize;
}
3.Push入栈
void Push(DStack * Ptrs, Elemtype x, int Tag)
{
//Tag作为区分两个栈的标志,取值1和2
if (Ptrs->top1 - Ptrs->top == 1)
{
printf("栈满\n");
return ;
}
if (Tag == 1) //等于1时让第一个口进
{
Ptrs->data[++(Ptrs->top)] = x;
}
else { //等于2时从第二个口进
Ptrs->data[--(Ptrs->top1)] = x;
}
}
4.Pop出栈
Elemtype Pop(DStack *Ptrs, int Tag)
{
//Tag 就是表示从哪个“口”出去
if (Tag == 1)
{
if (Ptrs->top == -1)
{
printf("栈1为空");
return NULL;
}
else {
return Ptrs->data[(Ptrs->top)--];
}
}
else
{
if (Ptrs->top1 == -1)
{
printf("栈2为空");
return NULL;
}
else {
return Ptrs->data[(Ptrs->top1)++];
}
}
}
采用链式存储结构的栈叫做链栈,通常采用单链表实现,规定链栈没有头结点
插入和删除操作只能在链栈的栈顶进行。
1.栈的链式结构定义
typedef struct LinkNode {
int data;
struct SNode *next;
}*LinkStack;
2.初始化
LinkStack InitStack()
{
LinkStack S;
S = (LinkStack)malloc(sizeof(LinkNode)); //S指针指向一个空间
S->next = NULL;
return S;
}
3.判断栈是否为空
int IsEmpty(LinkStack S)
{
return (S->next == NULL);
}