栈
栈又名堆栈,是一种受限的数据结构。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。如图(出入栈模型):
算法实现
1.进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2.退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
顺序栈代码实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#define SIZE 100
typedef int data_t;
typedef struct stack{
data_t data[SIZE];
int top; //定义栈顶
}stack;
stack * CreateStack() //创建一个空栈
{
stack * s = (stack *)malloc(sizeof(stack));
if(s == NULL)
return NULL;
memset(s->data,0,sizeof(s->data));
s->top = -1;
return s;
}
int Stack_is_empty(stack *s) //判断栈是否为空
{
if(s == NULL)
return -1;
return s->top == -1;
}
int Stack_is_full(stack * s) //判断栈是否为满
{
if(s == NULL)
return -1;
return s->top == SIZE-1;
}
int PushStack(stack *s,data_t data) //入栈
{
if(s == NULL || Stack_is_full(s))
return -1;
s->data[s->top+1] = data;
s->top++;
return 0;
}
data_t PosStack(stack *s) //出栈
{
if(s == NULL || Stack_is_empty(s))
return -1;
data_t m = s->data[s->top];
s->data[s->top] = 0;
s->top--;
return m;
}
int ClearStack(stack *s) //清空栈
{
if(s == NULL)
return -1;
memset(s->data,0,sizeof(s->data));
s->top = -1;
return 0;
}
void printStack(stack *s) //遍历
{
if(s == NULL)
return ;
int num = s->top;
for(; num >= 0; num--)
printf("%d ",s->data[num]);
printf("\n");
return ;
}
int main()
{
stack * s = CreateStack();
int i = 0;
while(i < 10)
{
PushStack(s,i);
i++;
}
printStack(s);
data_t m = PosStack(s);
data_t n = PosStack(s);
data_t x = PosStack(s);
data_t y = PosStack(s);
printf("%d %d %d %d\n",m,n,x,y);
return 0;
}
链式栈代码实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
typedef int data_t;
typedef struct node{
data_t data;
struct node *next;
}lstack;
lstack *CreateLstack()
{
lstack * top = (lstack *)malloc(sizeof(lstack));
if(top == NULL)
return NULL;
top->data = -1;
top->next = NULL;
return top;
}
int Lstack_is_empty(lstack * top)
{
if(top == NULL)
return -1;
return top->next == NULL;
}
int PushLstack(lstack * top,data_t data)
{
if(top == NULL)
return -1;
lstack * new = (lstack *)malloc(sizeof(lstack));
if(new == NULL)
return -1;
new->data = data;
new->next = NULL;
new->next = top->next;
top->next = new;
return 0;
}
data_t PosLstack(lstack * top)
{
if(top == NULL || Lstack_is_empty(top))
return -1;
data_t m;
lstack *p = top->next;
m = p->data;
top->next = p->next;
free(p);
p = NULL;
return m;
}
void printLstack(lstack * top)
{
if(top == NULL)
return ;
lstack *p = top->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return ;
}
int main()
{
lstack *ls = CreateLstack();
int i = 0;
while(i < 10)
{
PushLstack(ls,i);
i++;
}
printLstack(ls);
data_t m = PosLstack(ls);
data_t n = PosLstack(ls);
data_t a = PosLstack(ls);
printf("%d %d %d\n",m,n,a);
return 0;
}