C++实现栈的基础操作

C++栈的实现

《大学》–第四章

所谓诚其意者,毋自欺也。如恶如臭,如好好色,此之谓自谦,故君子必慎独也。

小人闲居为不善,无所不致,见君子然后厌然, 揜其不善而著其善。

人之视己,如见其肺肝然,则何益矣?

此谓诚于中,形于外,故君子必慎其独也。

曾子曰:“十目所视,十手所指,其严乎!”

富润屋,德润身,心广体胖,故君子必诚其意。

译文:

所谓真诚面对自己的意念,就是指不要欺骗自己。就像讨厌难闻的味道,就像喜欢美丽的色彩,这样才可以说让自己满意了,因此君子一定要在独处时特别谨慎。小人平日就不做善的事,没有什么坏事不做的;看到君子之后,才躲躲闪闪的样子,遮掩他所做的坏事,并且弘扬他所做的善事,就像看透自己的肺肝一样清楚,这样做又有什么用处呢?这叫做:心中的真正情况会显示于外在的言行上,因此君子一定要在独处时特别谨慎。

曾子说:“十只眼在看着,十只手指在指着,真是严厉啊!”

财富可以装潢屋子,德行可以滋润身体。心胸开阔而体态舒适,因此君子一定要真诚的面对自己的意念。

1.栈(stack)的定义

栈是限定仅在表尾进行插入和删除操作的线性表

  1. 栈顶:
    1. 允许插入和删除的一端叫做栈顶(Top)
  2. FILO(先进后出)

2.栈的基础操作

  1. 栈的初始化
  2. 获取栈的元素个数
  3. 栈的判空操作
  4. 获取栈顶元素值
  5. 出栈
  6. 出栈的同时获取栈顶元素值
#include<iostream>
using namespace std;
enum { STACK_INIT_SIZE = 20, STACK_INC_SIZE = 2 };
#define T int
class MyStack {
private:
	T * data;
	int top;
	int size;
public:
	//构造函数--申请资源
	MyStack() :data(nullptr), top(-1), size(STACK_INIT_SIZE) {
		data = new(nothrow) T[size];
		if (data == nullptr) {
			exit(1);
		}
	
	}
	//析构函数--释放资源
	~MyStack() {
		delete[]data;
		data = nullptr;
		top = -1;
		size = 0;
	}
	//拷贝构造函数
	MyStack(const MyStack& stack) {
		size = stack.size;
		top = stack.top;
		data = new T[size];
		memmove(data, stack.data, sizeof(T) * stack.Size());
	}
	bool Resize(T newsize) {
		if (newsize <= size)return true;
		//在这里注意 申请空间以2倍扩容
		T* newdata = new(nothrow)T[STACK_INIT_SIZE*STACK_INC_SIZE];
		if (newdata == nullptr) {
			return false;
		}
		memmove(newdata, data, sizeof(T) * Size());
		delete []data;
		data = nullptr;
		data = newdata;
		size = STACK_INIT_SIZE*2;
		return true;
	}
	//获取元素个数
	int Size() const {
		return top + 1;
	}
	//判空操作
	bool Empty()const {
		return Size()==0;
	}
	int  Capc()const{
		return size;
	}
	//判满
	bool  Full() {
		//如果栈中元素的个数与栈的大小相等的话,那么栈已满
		return Size() == Capc();
	}
	//入栈
	bool  Push(const T val) {
		//栈已满,入栈失败
		if (Full()&&!Resize(STACK_INIT_SIZE*STACK_INC_SIZE)) {
			return false;
		}
		top += 1;
		data[top] = val;
		return true;
	}
	T Top()const {
		if (!Empty()) {
			return data[top];
		}
		else {
			cout << "栈为空,无元素" << endl;
			return false;
		}
	}
	bool  Pop() {
		if (!Empty()) {
			top -= 1;
			return true;
		}
		return false;
	}
	//既要出栈也要获取栈顶元素值
	T GetPop() {
		if (!Empty()) {
			T x = data[top];
			top -= 1;
			return x;
		}
		return false;
		cout << "栈已经为空,没有元素可以出栈" << endl;
	}
};
int main() {
	int n;
	cin >> n;
	MyStack st;
	for (int i = 0; i < n; i++) {
		st.Push(i );
	}
	for (int i = 0; i < n; i++) {
		cout <<st.Top() << "\t";
		st.Pop();
	}
	return 0;
}

### 外平与内平的区别 在外平(External Plane Stack)和内平(Internal Plane Stack)的概念中,主要涉及的是硬件架构中的平面管理机制以及数据流处理方式的不同。 #### 定义与功能 外平通常指的是外部存储器或外部接口上的帧缓冲区(Frame Buffer),其主要用于保存屏幕显示的数据并提供灵活的内存访问能力。相比之下,内平则是指嵌入到特定芯片内部的专用资源池或者缓存区域,用于加速本地操作[^1]。 对于 Android 图形合成和显示系统而言,在基于高通 MSM8k MDP4 平台的情况下,当执行 `FBIOPUT_VSCREENINFO` 或者 `FBIOPAN_DISPLAY` 命令时,最终会触发函数 `msm_fb_pan_display()` 的调用。此过程可能涉及到对外部帧缓冲区的操作调整,而这些操作往往依赖于外平来完成更复杂的图像渲染任务[^1]。 另一方面,在 mipi_dsi_probe 函数实现过程中提到的具体设备 ID 实例化,则反映了如何初始化连接至 MIPI DSI 控制器的相关组件,并配置好对应的物理层参数以便后续通信正常运行[^2]。这里所描述的内容更多偏向底层驱动层面的工作细节,间接体现了内外两种不同类型的平面堆叠结构之间的协作关系。 #### 数据交互模式 从数据交互的角度来看: - **外平**:由于位于 SoC 芯片之外的位置上,因此具备较高的可扩展性和通用性,能够支持多种分辨率及色彩格式的需求变化;然而也正因为如此,它可能会面临更高的延迟成本以及带宽占用问题。 - **内平**:作为紧密集成的一部分存在于处理器核心附近甚至内部之中,可以显著减少信号传输路径长度从而降低功耗水平的同时提高效率表现。不过受限于面积大小等因素影响,它的容量一般较小且定制程度较高,难以满足所有场景下的应用需求[^3]。 #### 性能对比分析 就性能指标方面来说: | 特性 | 外平 | 内平 | |--------------|----------------------------------|--------------------------------| | 访问速度 | 较慢 | 更快 | | 存储空间 | 可大范围调节 | 有限固定 | | 功耗情况 | 高 | 低 | | 应用灵活性 | 强 | 中等 | 综上所述,尽管两者各有优劣之处但在实际部署当中往往会结合使用以达到最佳效果平衡点。 ```c // 示例代码片段展示部分逻辑流程简化版 void configureDisplayStack(bool useExternalBuffer){ if(useExternalBuffer){ setupExternalPlaneResources(); // 设置外平相关资源配置 }else{ initializeInternalCacheSystem(); // 初始化内平缓存子系统 } } ``` 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值