栈的知识

来源:互联网 发布:复读好不好知乎 编辑:程序博客网 时间:2024/06/18 06:06

1、定义

          栈是限制仅能在表的一端进行插入和删除操作的线性表

          栈顶(top):               允许插入和删除的一端

          栈底(bottom):    不允许插入和删除的一端

          空栈:     不含元素的空表

2、栈的存储结构

         (1)顺序

结构定义:

#define mazsize  100   //栈的最大容量
typedef  int elemtype;
typedef struct 
{
elemtype elem[mazsize];
int top;
}sqstacktp;


初始化栈:

void  Initstack(sqstacktp *s)

s->top = 0;    //将顺序栈s初始化为0
}

判断栈空:

int StackEmpty(sqstacktp *s)
{
if (s->top > 0)
return 0;
else
return 1;
}

压栈:

void Push(sqstacktp *s,elemtype x)
{
if (s->top == maxsize)
printf("Overflow");
else
s->elem[s->top++] = x;   //x进栈
}

出栈:

elemtype Pop(sqstacktp *s)
{
if (s->top == 0)
return NULL;
else
{
s->top--;                //栈顶指针减1
return s->elem[s->top];  //返回栈顶元素值

}
}

求栈深:

int Size(sqstacktp *s)
{
return s->top;
}

取栈顶元素操作:

elemtype Top(sqstacktp *s)
{
if (s->top == 0)
return NULL;
else
return s->elem[s->top-1];
}

         (2)链式

结构定义:

typedef int elemtype;
typedef struct stacknode
{
elemtype data;
struct  stacknode *next;
}stacknode;

typedef struct
{
stacknode *top;     //栈顶指针
}LinkStack;

初始化:

void InitStack(LinkStack *ls)
{
ls->top = NULL;
}

进栈:

void Push(LinkStack *ls, elemtype x)
{
stacknode *s = NULL;
s = (stacknode *)malloc(sizeof(stacknode));      //生成新结点

s->data = x;
s->next = ls->top;                               //链入新结点
ls->top = s;                                     //修改栈顶指针

}

出栈:

elemtype Pop(LinkStack *ls)
{
stacknode *p = NULL;


elemtype x;
 
if (ls->top == NULL)         //删除栈顶元素返回NULL
return NULL;
else
{
x = (ls->top)->data;
p = ls->top;
ls->top = p->next;
free(p);

return x;               //返回元素值
}
}

0 0
原创粉丝点击