栈的定义:
进栈操作:
两栈共享空间:
对于两栈共享空间的push方法,需要有一个判断栈1还是栈2的参数stackNumber。
pop同理:
栈是限定仅在表位进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端为栈底,不含任何数据元素的栈称为空栈。
栈的插入操作,叫做进栈,也叫做压栈,入栈,打个比方,像子弹如弹夹;栈的删除操作,叫做出栈,有的叫做弹栈,如同子弹出弹夹。示意图如下:
栈的顺序存储结构及实现:
typedef struct
{
int data[MAXSIZE];
int top; /*用于栈顶指针*/
}SqStack;
进栈操作:
int push(SqStack *s, int e) /*int 可根据实际情况改变*/
{
if(s->top == MAXSIZE -1) /*栈满*/
{
return error;
}
s->top++; /*栈顶指针+1*/
s->data[s->top] = e; /*将新元素赋值给栈顶空间*/
return success;
}
int pop(SqStack *s, int *e) /*int 可根据实际情况改变*/
{
if(s->top == -1) /*栈满*/
{
return error;
}
*e = s->data[s->top];
s->top--; /*栈顶指针-1*/
return success;
}
两栈共享空间:
因为栈的大小是事先确定的,万一不够用,就需要扩展栈的容量,我们可以将两个相同类型的栈共用。做法如下图:
关键思路:
他们是在数组的两端,向中间靠拢,top1和top2是两个栈的栈顶指针,只要这两个不见面,两个栈就能使用。栈1空是,top1==-1,top2==n时,栈2为空。
栈满的情况:
若栈2空,top1 == n - 1,栈1满;栈1空,top2==0,栈2满;更多的情况是top1+1 == top2为栈满。
代码如下:
/*两栈共享空间结构*/
typedef struct
{
int data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;
对于两栈共享空间的push方法,需要有一个判断栈1还是栈2的参数stackNumber。
push代码:
int push(SqDoubleStack *s, int e,int stackNumber) /*int 可根据实际情况改变*/
{
if(s->top1 + 1 == s->top2) /*栈满*/
{
return error;
}
if(1 == stackNumber)
{
s->data[++s->top1] = e;
}
else if(2 == stackNumber)
{
s->data[++s->top2] = e;
}
return success;
}
pop同理:
int pop(SqDoubleStack *s, int *e,int stackNumber) /*int 可根据实际情况改变*/
{
if(1 == stackNumber)
{
if(-1 == s->top1)
{
return error;
}
*e = s->data[s->top1--];
}
else if(2 == stackNumber)
{
if(MAXSIZE == s->top2)
{
return error;
}
*e = s->data[s->top2++];
}
return success;
}
对于链栈来说,不存在栈满的情况;但是对于空栈来说,链栈的头指针指向空,即top==NULL时。链栈的结构代码如下:
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
上图是进栈示意图,下面是代码演示:
int push(SqStack *s, int e) /*int 可根据实际情况改变*/
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = s->top; /*把当前栈顶元素赋值给新结点的直接后继,如上图步骤1*/
s->top = s; /*将新结点s赋值给栈顶指针如步骤2*/
s->count++;
return success;
}
代码:
int pop(SqStack *s, int *e) /*int 可根据实际情况改变*/
{
LinkStackPtr p;
if(StackEmpty(*s)) /*空栈*/
{
return error;
}
*e = s->top->data;
p = s->top; /*栈顶结点赋值给p*/
s->top = s->top->next; //下移
free(p); //释放p
s->count--;
return success;
}