顺序栈和链栈

:(stack)是限定仅在表尾进行插入或删除操作的线性表。(用自己形象的话说,可以把栈比作一个没有盖的桶,栈底就是桶底,而栈顶就是你给桶里放的烧饼(一层只能放一个烧饼),最上面的那个烧饼就是栈顶)。当然你想取出桶底的烧饼,就必须一一的拿出最外面的烧饼,所以栈又称为后进先出(Last In First Out,LIFO)的线性表。

一.顺序栈

顺序栈就是利用顺序存储结构实现的栈,就是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,这里以top=0表示为空栈,鉴于C语言里数组下标从0开始。因此我们另设指针base指示栈顶元素在顺序栈中的位置。当top和base值相等时,表示空栈。顺序栈如下:

//顺序栈的存储结构
#define MAXSIZE 100
typedef struct {
    int *base;//栈底指针
    int *top;//栈顶指针
    int stacksize;//栈可用的最大容量
}SqStack;

1.栈的初始化

顺序栈的初始化操纵就是为顺序栈动态分配一个预订大小的数组空间(选一个大小合适的桶)

void InitStack(SqStack &s){
    s.base=new int[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
	s.top=s.base;//栈顶指针指向栈底指针,表示栈空
	s.stacksize=MAXSIZE;//给栈设置最大容量MAXSIZE
}

2.入栈

入栈操作就是指在栈顶插入一个新的元素,新的元素为栈顶元素(给桶里放烧饼,最上层的烧饼即是栈顶元素),而当栈满时,则不能继续放元素。

void Push(SqStack &s,int data){
	if((s.top-s.base)==s.stacksize){//栈满
		printf("栈满了\n");
	}else{
		*s.top++=data;//元素e压入栈中,栈顶指针加1
		printf("入栈成功!");
	}
}

3.出栈

出栈操作是将栈顶元素删除

特别注意的是:出栈元素出栈之后,栈顶指针减一,栈里的元素个数减一,而刚出栈的元素还在数组中,不能被删除,只是逻辑上的删除,并不能物理上的删除,就是在逻辑上,它已经是栈外元素了。

void Pop(SqStack &s){
	if(!(s.top-s.base)){//栈空
		printf("栈空\n");
		exit(0);
	}else{
		s.top--;//栈顶指针减1
		printf("入栈成功!\n");
	}
}

4.取栈顶元素

当栈非空时,此操作返回栈顶元素的值,栈顶指针保持不变。

int GetTop(SqStack &s){
	if(s.top!=s.base){
		return *(s.top-1);
	}
}

注意:出栈和入栈时分别要考虑栈空和栈满两种问题。

因为顺序栈和顺序表一样,受到最大空间的限制,虽然可以重新分配空间扩大容量,但是工作量比较大,应该尽量避免。因此无法估计到程序所需要的栈容量的大小时,应该采用链栈。

二.链栈

链栈是指采用链式存储实现的栈。通常链栈用单链表来表示,所以她的存储结构和单链表的存储结构相同,在这里,链栈就是可以无限伸缩的桶,根据你想放的烧饼的多少。

typedef struct StackNode{
	int data;//数据域存储
	struct StackNode *next;//指针域存储
}StackNode,*LinkStack;

1.栈的初始化

链栈的初始化操纵就是构造一个空栈,因为没有必要设头结点,所以直接将栈顶指针置空即可。

void InitStack(StackNode *s){
	//构造一个空栈,栈顶指针置空
	s=NULL;
}

2.入栈

链栈和顺序栈入栈操作不同的是,链栈在入栈前不需要判断栈是否满,只需要为入栈元素动态分配一个节点空间。

void Push(LinkStack s,int e){
	StackNode *p=new StackNode;//生成一个新节点
	p->data=e;//将新节点的数据域赋值e
	p->next=s;//将新节点插入栈顶
	s=p;//修改栈顶指针为p
}

3.出栈

和顺序栈一样,链栈在出栈前也需要判断栈是否为空,不同的是,链栈在出栈后需要释放出栈元素的栈顶栈顶空间。

void Pop(LinkStack &s){
	if(!s){//栈空
		printf("栈空");
	}
	StackNode *p=new StackNode;
	p=s;//用p临时保存栈顶元素空间,一杯释放
	s=s->next;//修改栈顶指针
	delete p;//释放原栈顶元素空间
}

4.取栈顶元素

与顺序栈一样,当栈非空时,此操作返回当前栈顶元素的值,栈顶指针S保持不变。

int GetTop(LinkStack s){

	if(s!=NULL){//栈非空
		return s->data;//返回栈顶元素。栈顶指针元素不变
	}
}

这是栈的基本操作,有什么错误的地方还希望能指出,共同进步。

posted @ 2018-12-23 16:50  _SpringCloud  阅读(42)  评论(0编辑  收藏  举报  来源