数据结构学习笔记之③——栈
栈的顺序存储结构
//栈的顺序存储
typedef struct
{
int data[MAXSIZE];
int top;
}SqStack;
//入栈
int Push(SqStack *S,int e)
{
if(S->top==MAXSIZE-1)
return 0;
S->top++;
S->data[S->top]=e;
return 1;
}
//出栈
int Pop(SqStack *S,int *e)
{
if(S->top==-1)
return 0;
*e=S->data[S->top];
S->top--;
return 1;
}
栈的链式存储
//栈的链式存储
typedef struct StackNode
{
int data;
struct StackNode * next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
//入栈
int Push(LinkStack *S,int e)
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data=e;
s->next=S->top;
S->top=s;
S->count++;
return 1;
}
//出栈
int Pop(LinkStack *S,int *e)
{
LinkStackPtr p;
*e=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
S->count--;
return 1;
}
两栈共享空间结构
适合两栈空间需求有相反关系的结构
//两栈共享空间结构
typedef struct
{
int data[MAXSIZE];
int top1;//栈1栈顶指针
int top2;//栈2栈顶指针
}SqDoubleStack;
int Push(SqDoubleStack *S,int e,int stackNumber)
{
if(S->top1+1==S->top2)
return 0;
if(stackNumber==1)
S->data[++S->top1]=e;
else if(stackNumber==2)
S->data[--S->top2]=e;
return 1;
}
int Pop(SqDoubleStack *S,int *e,int stackNumber)
{
if(stackNumber==1)
{
if(S->top1==-1)
return 0;
*e=S->data[S->top1--];
}
else if(stackNumber==2)
{
if(S->top2==MAXSIZE)
return 0;
*e=S->data[S->top2++];
}
return 1;
}