栈是一种特殊的线性表,特殊性在于它的操作受限,栈限定在表尾进行插入和删除,其中表尾称为栈顶,表头称为栈底。学习栈这种特殊结构主要是要学会它的主要操作,包括:创建一个空栈,判空,入栈(插入栈顶元素),出栈(删除栈顶元素)。其中实现栈的基本操作可以通过顺序表和链表的方式。
栈的主要特点:后进先出
图解:
栈的抽象数据类型
顺序表:
SeqStack SetNullStack_Seq(int m) 创建一个空栈
int IsNullStack_Seq(Stack stack) 判断stack是否为空
void Push_Seq(Stack stack,DataType x) 向栈stack中插入元素x
DataType Pop_Seq(Stack stack) 从栈stack中去出栈顶元素并删除
链表:
LinkStack SetNullStack_Link()
int IsNullStack_Link(LinkStack top)
void Push_Link(LinkStack top,DataType x)
DataType Pop_Link(LinkStack top)
顺序表实现栈
顺序栈类型表示
typedef int DataType;
struct Stack
{
int Max;//最大容量
int top;//栈顶指针
DataType*elem;//存放元素的起始指针
};
typedef struct Stack*SeqStack;
创建一个空栈
SeqStack SetNullStack_Seq(int m)
{
SeqStack s = (SeqStack)malloc(sizeof(struct Stack));
if(s!=NULL)
{
s->elem = (DataType*)malloc(sizeof(DataType)*m);
if(s->elem!=NULL)
{
s->top = 0;//或者s->top = -1
s->Max = m;
return s;
}
else
{
free(s);
return NULL;
}
}
else
{
printf("Alloc failure!\n");
return NULL;
}
}
判断stack是否为空
int IsNullStack_Link(Stack stack)
{
if(stack->top = 0)//或者stack->top = -1;
{
return 1;
}
else
{
return 0;
}
}
向栈stack中插入元素x
void Push_Seq(Stack stack,DataType x)
{
if(s->top>s->Max-1)//说明栈以满
{
printf("overflow,cannot insert");
}
else
{
s->elem[s->top] = x;
s->top++;//当top起始位置为0时的情况
}
}/*当top起始位置为-1时
void Push_Seq(Stack stack,DataType x)
{
if(s->top>=s->Max-1)//说明栈以满
{
printf("overflow,cannot insert");
}
else
{
s->top++;
s->elem[s->top] = x;
}
从栈stack中去出栈顶元素并删除
DataType Pop_Seq(Stack stack)
{
DataType index;
if(stack->top==0)
{
printf("not exit!\n");
return -1;
}
else
{
index = stack->elem[s->top];
stack->top--;
return index;
}
}
链表实现栈
链栈类型表示
typedef int DataType;
struct Node
{
DataType data;
struct Node*next;
};
typedef struct Node*PNode;
typedef struct Node*top,*LinkStack;
创建一个空栈
LinkStack SetNullStack_Link()
{
LinkStack top = (LinkStack)malloc(sizeof(struct Node));
if(top!=NULL)
{
top->next = NULL;
return top;
}
else
{
printf("Alloc failure!\n");
return NULL;
}
}
判断stack是否为空
int IsNullStack_Link(LinkStack top)
{
if(top->next==NULL)
return 1;
else
return 0;
}
向栈stack中插入元素x
void Push_Link(LinkStack top,DataType x)
{
PNode p;
p = (PNode)malloc(sizeof()struct Node);
if(p!=NULL)
{
p->data = x;
p->next = top->next;
top->next = p;
}
}
从栈stack中去出栈顶元素并删除
DataType Pop_Link(LinkStack top)
{
DataType index;
if( IsNullStack_Link(top))
{
printf("not exit!\n");
return -1;
}
else
{
index = top->next->data;
top->next = top->next->next;
return index;
}
}