數據結構學習筆記之③——棧
棧的順序存儲結構
//棧的順序存儲
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;
}