栈和队列的类实现(代替STL)
区分
1.表达式:count++—— 运算:给count+1——表达式的值:count原来的值(未加1之前的值)
2.表达式:++count ——运算:给count+1—— 表达式的值:count加1以后的值
1.栈
线性栈
//线性栈
class stack {
public:
//1.压栈
void Push(int m) {
data[top++] = m;//先赋值后++
}
//2.弹出栈顶元素
int Pop() {
return data[--top];//先--再赋值
//如果不用返回 直接top-1 返回类型int改为void
}
//3.栈的初始化
void InitStack() {
top = 0;
}
//4.判空
bool Empty() {
if (top == 0) return true;
return false;
}
//5.取栈顶元素但是不删除
int Top(){
return data[top-1];//!!!注意这里!!!
}
private:
int top;//栈顶指针(指向即将放入的元素,这个可以自己改)
int data[1000];//静态数组放栈中元素
};
存放二叉树指针的栈
//放二叉树结点的线性栈
class stack{
public:
//1.初始化
void InitStack(){
top = 0;
}
//2.二叉树指针压栈
void Push(TreeNode *p){
stack[top++] = p;
}
//3.弹栈
void Pop(){
top--;
}
//4.判空
bool Empty() {
if (top == 0)return true;
return false;
}
//5.取栈顶元素
TreeNode* Top( ){
return stack[top-1];
}
private:
int top;
TreeNode *stack[512];
};
2.队列
下图代码的队首和队尾指针设置
front—指向队头元素
rear—指向队尾元素的后一个位置(下一个应该插入的位置)
线性队列
//线性队列
class Queue {
public:
//1.初始化函数
void InitQueue( ) {
rear = front = 0;
}
//2.判断队列是否为空 (不太严谨)
bool QueueEmpty() {
if (rear == front) return true; //空的话返回true
else return false;
}
//3.入队
bool EnQueue(int e) {
if (rear == MAXSIZE) return false;//这句必须有!要不数组越界!(数组范围MAXSIZE-1)
data[rear++] = e;
return true;
}
//4.出队 直接输出版
int DeQueue() {//出队的是队头顶点
if (rear == front) return false;
int x = data[front++];
return x;
}
//4.5出队 只出队不输出
void PopQueue(){
front = front + 1;//注意这里!
}
//5.取队头元素(返回首元素)
TreeNode* Front(){
return data[front];
}
private:
int front, rear;
int data[MAXSIZE];
};
存放二叉树指针的队列
//放二叉树结点的队列
class Queue {
public:
//1.初始化函数
void InitQueue( ) {
rear = front = 0;
}
//2.判断队列是否为空
bool Empty() {
if (rear == front) return true; //空的话返回true 不绝对!
else return false;
}
//3.入队
bool Push(TreeNode* e) {
if (rear == MAXSIZE) return false;//必须有 不然会数组越界!
data[rear++] = e;
return true;
}
//4.删除队头元素
void Pop(){
front = front + 1;//注意这里! rear front都是向后递增的
}
//5.返回首元素
TreeNode* Front(){//数组越界?
return data[front];
}
private:
int front, rear;//队尾指针—指向队尾元素的后一个位置 队头指针—指向队头元素
TreeNode* data[MAXSIZE];//存的是指针而不是结点!不用保存整个节点
};