数据结构---链栈的基本操作

链栈的实现和表示

链栈是指采用链式存储结构实现的栈。通常链栈用单链表来表示。
这里没有头结点,链表的头部就是栈顶。

image-20220114144055141

链栈的存储结构:

typedef struct StackNode

{

ElemType data;

struct StackNode *next;

} StackNode,*LinkStack;

1.初始化

算法思想:构造一个空栈,直接将栈顶指针置空

2.入栈

算法思想:为入栈元素动态分配一个结点空间(和顺序栈不同的是,这是动态分配,不像顺序栈得提前分配一个最大容量,后续加入元素直接再分配,不用考虑栈满的情况)

算法步骤:

  • 为入栈元素 e 分配空间, 用指针 p 指向。
  • 将新结点数据域置为e。
  • 将新结点插入栈顶。(p->next=S;)
  • 修改栈顶指针为 p。(S=p;)
image-20220114145458557

3.出栈

算法思想:判断栈是否为空,链栈在出栈后需要释放出原栈元素的栈顶空间(先用了一个指针临时保存了栈顶元素的空间,栈顶指针向下挪一位,原来栈顶空间需要被释放)

算法步骤:

  • 判断栈是否为空 , 若空则返回ERROR。
  • 将栈顶元素赋给e。(e=S->data;)
  • 临时保存栈顶元素的空间, 以备释放。(p=S;)
  • 修改栈顶指针, 指向新的栈顶元素。(S=S->next;)
  • 释放原栈顶元素的空间。(delete p;)
image-20220114150548251

4.取栈顶元素

算法思想:当栈非空时, 此操作返回当前栈顶元素的值, 栈顶指针S保持不变。

6.判断栈是否为空

算法思想:判断栈顶指针即链表的头指针是否指向空(S==NULL;)(这里不存在头结点,所以不是判断头结点的指针域是否为空)

7.清空栈

算法思想:一个个删除栈里的元素即出栈,直到栈为空(栈还存在)

8.销毁栈

算法思想:一个个删除栈里的元素即出栈,直到栈为空,最后再把栈顶指针指向的空间给释放掉(栈不存在)

9.查看栈元素的个数

算法思想:再设置一个指向栈底元素的指针,两个指针相减再加一就为栈元素个数,或者不另外设置指针,将栈顶指针向下挪,并设置同步计数变量,直至栈顶指针的指针域为空,返回计数变量的大小即为元素的个数。

10.遍历栈

算法思想:设置一个指针p指向栈顶(和栈顶指针指向一致),不断将p指针向下挪,同时打印p指针指向结点的数据域

代码实现

#include<iostream>
using namespace std;
typedef struct node
{
	int data;
	struct node* next;
}Node, * stack;

//初始化栈
void initialsatck(stack& s)
{
	s = new Node;
	s->next = NULL;
}
//判断栈是不是空的
bool isempty(stack& s)
{
	if (s== NULL)
	{
		cout << "栈不存在" << endl;
		exit(0);
	}
	if (s->next == NULL)
	{
		return true;
	}
	return false;
}
//入栈
void push(stack& s, int e)
{
	//先开辟一个空间存储新的数据
	Node* p = new Node;
	p->data = e;
	p->next = s->next;
	s->next = p;
}

//出栈
int pop(stack& s)
{
	if (isempty(s))
	{
		exit(1);
	}
	Node* p = s->next;
	s->next = p->next;
	int e = p->data;
	delete p;        //清空取出数据的空间
	return e;
}
int getlength(stack& s) //取栈的地址,进行查看栈的长度
{
	Node* p = s;
	int length = 0;
	while (p->next != NULL)
	{
		p = p->next;
		length++;
	}
	return length;
}
//获取栈顶元素
int gettop(stack& s)
{
	if (isempty(s))
	{
		exit(1);
	}
	return s->next->data;
}
//清空栈
void clearstack(stack& s)
{
	while (!isempty(s))
	{
		pop(s);
	}
}
//销毁栈
void destorystack(stack& s)
{
	while (!isempty(s))
	{
		pop(s);
	}
	delete s;
	s = NULL;
}
void print(bool b)
{
	if (b)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
}
int main()
{
	stack s;
	initialsatck(s);

	for (int i = 0; i < 12; i++)
	{
		push(s, i);
	}
	cout << getlength(s) << endl;
	clearstack(s);
	cout << getlength(s) << endl;
	destorystack(s);
	return 0;
}

posted on 2022-02-06 19:55  眉目作山河  阅读(1136)  评论(0编辑  收藏  举报

导航