因为我不会模板,所以我写了两个stack,一个用来存表达式使其变为后缀,另一用来存Node节点使其变为一棵树,在写的过程中我一直在思考要不要写拷贝和移动构造,最后还是没有写。
1、下面是表达式中缀变后缀的栈的代码:
声明:
#pragma once
#include <iostream>
using namespace std;
class MyStack {
private:
const int DEAFAULT_CAPACITY = 10;/*定义栈初始化长度*/
const int STACK_INCREMENT = 2;/*定义栈增量*/
int* base;/*栈底元素*/
int* top;/*栈顶的下一个元素*/
int stackSize;/*目前容量*/
int maxCapacity = 0;
public:
MyStack();
MyStack(initializer_list<int> list);
MyStack(MyStack& stack);
MyStack(MyStack&& stack);
~MyStack();
int* begin();
int* end();
//入栈
void push(int element);
//退栈
int pop();
//得到栈顶元素
int getTop();
//清空
void clear();
//扩容操作
void ensureCapacity(int newCapacity);
int size();
};
定义:
#include <iostream>
#include "myStack.h"
using namespace std;
int* MyStack::begin() {
return base;
}
int* MyStack::end() {
return& base[stackSize];
}
MyStack::MyStack() {
stackSize = 0;
base = NULL;
top = NULL;
}
MyStack::MyStack(initializer_list<int> list)
:base(new int[list.size()]), stackSize(list.size()), maxCapacity(list.size()) {
copy(list.begin(), list.end(), base);
top = &base[list.size() - 1];
}
MyStack::MyStack(MyStack& stack) {
stackSize = stack.stackSize;
maxCapacity = stack.maxCapacity;
base = new int[maxCapacity];
for (int i = 0; i < stackSize; i++) {
base[i] = stack.base[i];
}
top = &base[stackSize];
}
MyStack::MyStack(MyStack&& stack) {
this->base = stack.base;
stack.base = NULL;
this->top = stack.top;
stack.top = NULL;
this->stackSize = stack.stackSize;
this->maxCapacity = stack.maxCapacity;
}
MyStack::~MyStack() {
if (base != NULL) {
delete[] base;
base = NULL;
}
top = NULL;
}
//入栈
void MyStack::push(int element) {
if (stackSize == 0) {
ensureCapacity(DEAFAULT_CAPACITY);
}
if (maxCapacity == stackSize) {
ensureCapacity(maxCapacity * STACK_INCREMENT + 1);
}
*top = element;
top = &(base[++(stackSize)]);
}
//退栈
int MyStack::pop() {
if (stackSize == 0) {
return NULL;
}
top = &(b