stack简述

#ifndef _mystack_H
#define _mystack_H
typedef int elemtype;

#define ok 1000
#define failed 10001
#define Error 10002
struct node
{
	elemtype data;
	struct node *next;
};
typedef struct node Node;

struct stack
{
	Node *top;
	int count;
};
typedef struct stack linkstack;

int initstack(linkstack *s);
int push(linkstack *s,elemtype e);
int empty(linkstack *s);
int gettop(linkstack *s);
int pop(linkstack *s);

#endif

#include<stdio.h>
#include<stdlib.h>
#include"stack.h"
int initstack(linkstack *s)
{
s->top = NULL;
s->count = 0;
return ok;
}


int push(linkstack *s,elemtype e)
{
Node *p = (Node *)malloc(sizeof(Node));
if(p == NULL)
{
return failed;
}
if(s == NULL)
{
return failed;
}
p->data = e;
p->next = s->top;
s->top = p;
s->count++;
return ok;
}


int empty(linkstack *s)
{
if(s == NULL)
{
return Error;
}
return (s->count == 0)?failed:ok;
}


int gettop(linkstack *s)
{
if(s->top == NULL)
{
// printf("stack is NULL\n");
return failed;
}
return (s->top->data);
}


int pop(linkstack *s)
{
Node *p;
int j;
if(p == NULL)
{
return failed;
}
if(s->top == NULL)
{
return failed;
}
p = s->top;
j = s->top->data;
s->top = p->next;
free(p);
s->count--;
return j;

}

栈是限定仅在表头进行插入和删除操作的线性表。要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。”栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

两种常用的栈 
顺序栈: 
使用连续的内存空间模拟栈的空间,一般使用数组来实现,数组索引为0即为栈底,其次再定义一个变量储存栈顶位置即可,这种栈实现起来比较简单容易操作,适合初学者。

链式栈 :
使用零散的内存空间模拟栈的空间,一般使用链表1来实现,链表尾部即为栈底,链表头部即为栈顶。

栈的顺序存储结构 :
栈的顺序存储结构需要使用一个数组和一个整型变量来实现。利用数组来顺序存储栈中的所有元素,利用整型变量来存储栈顶元素的下标位置,可这个变量称为栈顶指针。

栈的链式存储结构 :
栈的链式存储结构是通过由结点构成的单链表实现的,此时表头指针被称为栈顶指针,由栈顶指针指向的表头结点被称为栈顶结点,整个单链表被称为链栈。对链栈的插入和删除操作是在单链表的表头进行的。 
当向一个链栈插入元素时,是把该元素插入到栈顶,即,使该元素结点的指针域指向原来的栈顶结点,而栈顶指针则修改为指向该元素结点,使该结点成为新的栈顶结点。

两栈的空间共享 :
当程序中同时使用两个栈时,可以将两个栈的栈底设在向量空间的两端,让两个栈各自向中间延伸。 
当一个栈的元素较多,超过向量空间的一半时,只要另一个栈的元素不多,那么前者就可以占用后者的部分存储空间。只有当整个向量空间被两个栈占满(即两个栈顶相遇)时,才会发生上溢,因此两个栈共享一个长度为m的向量空间

猜你喜欢

转载自blog.csdn.net/qq_38313246/article/details/78618843