王道数据结构伪代码实现——第三章 栈和队列

本文详细介绍了顺序栈的定义、初始化、判空、入栈、弹栈及获取栈顶元素,同时涵盖了循环队列的定义、初始化、判空、入队和出队操作。这些基本数据结构对于理解算法和系统设计至关重要。

3.1 顺序栈

3.1.1 栈的定义

#define MaxSize 50
typedef int ElemType;

typedef struct {
	ElemType data[MaxSize];
	int top;//栈顶指针——始终指向栈顶元素
}SqStack;

3.1.2 初始化栈

//初始化栈
bool InitStack(SqStack& S) {
	S.top = -1;
	return true;
}

3.1.3 判空

bool StackEmpty(SqStack S) {
	if (S.top == -1) {
		return true;
	}
	return false;
}

3.1.4 入栈

栈满不入:

bool Push(SqStack& S, ElemType x) {
	if (S.top == MaxSize - 1) {//栈满不入
		return false;
	}
	S.data[++S.top] = x;//先S.top++,再S.data[S.top] = x,即先移动栈顶指针,再赋值
	return true;
}

3.1.5 弹栈

栈空不出:

bool Pop(SqStack& S, ElemType& x) {
	if (S.top == -1) {
		return false;
	}
	x = S.data[S.top--];
	return true;
}

3.1.6 获取栈顶元素

bool GetTop(SqStack& S, ElemType& x) {
	if (S.top == -1) {
		return false;
	}
	x = S.data[S.top];
	return true;
}

3.2 循环队列

3.2.1 队列的定义

#define MaxSize 5
typedef int ElemType;

typedef struct {
	ElemType data[MaxSize];
	int front, rear;
}SqQueue;

3.2.2 初始化队列

void InitQueue(SqQueue& Q) {
	Q.rear = Q.front = 0;//初始化时要为0
}

3.2.3 判空

bool isEmpty(SqQueue Q) {
	if (Q.rear == Q.front) {//判空不需要为0,而初始化才需要为0
		return true;
	}
	else {
		return false;
	}
}

3.2.4 入队

队满不入:

//入队
bool EnQueue(SqQueue& Q, ElemType x) {
	if ((Q.rear+1)%MaxSize==Q.front) {//队满不入
		return false;
	}
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;//队尾指针后移
	return true;
}

3.2.5 出队

队空不出:

bool DeQueue(SqQueue& Q, ElemType& x) {
	if (Q.front == Q.rear) {//队空不出
		return false;
	}
	x = Q.data[Q.front];
	Q.front = (Q.rear + 1) % MaxSize;
	return true;
}

C++中的伪指针域(Fake Pointer)是指一个类中的成员变量,它的类型是一个自定义的结构体,结构体中包含了一个指向当前类对象的指针。通过这种方式,可以在一个类中实现类似于指针的功能,而不需要使用实际的指针类型,从而避免了指针可能带来的安全问题内存管理问题。 伪指针域通常用于实现一些数据结构,如链表、树等。在这些数据结构中,每个节点都需要保存一个指向其父节点或子节点的指针,而使用伪指针域可以简化指针的管理,并且可以避免一些指针操作的错误。 下面是一个使用伪指针域实现二叉树节点的代码示例: ```c++ class TreeNode { public: int val; TreeNode* left; TreeNode* right; struct FakePointer { TreeNode* ptr; FakePointer(TreeNode* p = nullptr) : ptr(p) {} operator TreeNode*() const { return ptr; } TreeNode* operator->() const { return ptr; } } parent; TreeNode(int val = 0, TreeNode* left = nullptr, TreeNode* right = nullptr) : val(val), left(left), right(right), parent(nullptr) {} }; ``` 在该实现中,`TreeNode`类中包含了一个名为`parent`的伪指针域,它的类型为一个自定义的结构体`FakePointer`,结构体中包含了一个指向当前节点父节点的指针`ptr`。在`FakePointer`结构体中,重载了类型转换操作符箭头操作符,使得可以在访问`parent`成员变量时,像访问指针一样的方式进行操作。 使用伪指针域可以使得代码更加简洁、安全、易于维护,但是也可能会带来一些性能损失,因为每个节点都需要额外的空间来保存一个指针。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值