【数据结构地图】链栈操作

 链栈是使用链表存储结构实现的栈,一种操作受限的线性表。节点组成元素与链表是一样的,这里的链表使用单链表,由于栈只能在一端进行操作,所以使用双链表是比较多余的。只需要一个指针top作为栈顶指针。注意一下,链栈一般是不带头节点的,这个地方需要和单链表区分开

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

Node* top;//栈顶指针

bool empty() {
	return top == NULL;//栈一般没有头节点
}//当top指针为空时表示空栈

Clear()函数实现流程 

 Clear()函数跟单链表里的Clear()是一样的,用迭代法删除所有节点。

  1. 新建指针p
  2. top指针非空: 1、p指向top所指  2、top移动到右侧节点  3、p指针删除所指对象      
void Clear() {
	Node* p;
	while (top != NULL) {
		p = top;//p首先指向top所指
		top = top->next;//top移向下一节点
		delete p;//p将原节点删除
	}
	cout << "链栈已清空" << endl;
}

 Size()函数实现流程

通过临时指针遍历链栈,求栈长度。

  1. 创建一个临时指针p指向top所指
  2. 创建一个计数变量count
  3. while循环,当p不指向NULL时执行;每次计数变量+1,p指向右一节点
  4. 最后返回计数变量值
int Size() {//获取栈长度的函数
	Node* p = top;//临时指针p指向top所指
	int count = 0;//用于计数的变量
	while (p!=NULL) {//只要p不指向空,就继续循环
		count++;
		p = p->next;//指针p移动到下一个节点
	}
	cout << "栈长度为: " <<count<< endl;
	return count;//返回最终计数值
}

 Push()函数实现流程

  1. 先开辟一块新节点,完成节点的赋值工作
  2.  然后新节点指向上一个节点的地址(就是top指针指向的地方)
  3. 然后top指针再指向新的节点
void Push(int value) {//传入一个值
	Node* p = new Node();//用p接受新开辟的堆区内存
	cout << "压入 " << value << endl;
	p->data = value;//传入的值赋给新节点
	p->next = top;//p指向节点的next指向top所指
	top = p;
}

 Pop函数实现流程

  1. 判断是否空栈
  2. 创建临时指针p,p指向top所指
  3. 访问p指向节点的数据
  4. top指针指向右一节点
  5. 用p删除原来的节点
int Pop() {
	if (empty()) {//空栈检测
		cout << "栈空,无数据可弹出" << endl;
		return 0;
	}
	Node* p = top;//临时指针p指向top所指
	int value = p->data;
	top = top->next;//top指针移至下一位
	delete p;//用临时指针删除对象
	cout << "弹出 " << value << endl;
	return value;//返回节点值
}

 GetTop函数实现流程

  1. 判断是否为空栈
  2. 非空栈情况用top指针访问指向节点的数据
int GetTop() {
	if (empty()) {//空栈检测
		cout << "栈空,无数据" << endl;
		return 0;
	}
	cout << "栈顶元素值为 " <<top->data<<endl;
	return top->data;//返回top指向的节点值
}

测试用代码,懒得手敲可以直接搬走

int main() {
	Push(3);
	Push(2);
	Push(87);
	Push(134);
	Pop();
	Pop();
	Clear();
	Pop();
	Push(57);
	GetTop();
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值