基本数据结构—— 栈(动态数组C++)

顺序栈

  • 特点:先进后出、后进先出

  • 栈底、栈顶

  • 栈的操作

    • Push 将数据压入堆栈(stack[++top] = item;)

    • Top 栈顶位置

    • Pop 删除栈顶位置的数据

    • IsEmpty 判断栈是否为空,即判断top是不是-1

//创建头函数 MyStack.h

#ifndef _MYSTACK_H
#define _MYSTACK_H

#include "MyUtil.h"

template<class T>
class MyStack {
public:
	MyStack(int stackCapacity = 10);
	~MyStack();

	bool IsEmpty() const;
	T& Top() const;
	void Push(const T& item);
	void Pop();
private:
	T* stack;
	int top;
	int capacity;//数组的大小
};

template<class T>
void MyStack<T>::Pop() {  //删除栈顶的数据
	if (IsEmpty()) throw"Stack is empty.Cannot delete.";
	//top--;
	stack[top--].~T();
}

template<class T>
inline bool MyStack<T>::IsEmpty() const { //栈是否为空
	return top == -1;
}

template<class T>
inline T& MyStack<T>::Top() const {  //返回栈顶的数据
	if (IsEmpty()) throw"Stack is empty";
	return stack[top];
}

template<class T>
MyStack<T>::MyStack(int stackCapacity) :capacity(stackCapacity) { //构造函数
	if (capacity < 1)throw"stack capacity must be >0";
	stack = new T[capacity];//新建一个具有动态大小的数组
	top = -1;
}

template<class T>
MyStack<T>::~MyStack() { //析构函数
	delete[] stack; //删除动态数组stack
}

template<class T>
void MyStack<T>::Push(const T& item) {  //Push函数,将item压入堆栈
	if (top == capacity - 1) {
		Changesize1D(stack, capacity, 2 * capacity);
		capacity *= 2;
	}
	stack[++top] = item;
}

#endif


//创建头函数 MyUtil.h

#ifndef _MYUTIL_H
#define _MYUTIL_H
#include<math.h>
using namespace std;

template<class T>
void Changesize1D(T*& a, const int oldSize, const int newSize);///数组尺寸放大一倍

template<class T>
void Changesize1D(T*& a, const int oldSize, const int newSize) {
	if (newSize < 0) throw"New lenth must be >=0";
	T* temp = new T[newSize];
	//int number = min(oldSize, newSize);
	int number = 0;
	if (oldSize > newSize) number = newSize;
	else number = oldSize;
	copy(a, a + number, temp);
	delete[] a;
	a = temp;
}
#endif

//main.cpp 主函数,用来测试

#include<iostream>
#include"MyStack.h"
#include "MyUtil.h"
using namespace std;

class Dog {

};

int main() {
	MyStack<string> myStringStack;
	MyStack<Dog> dogStack;
	MyStack<int> st(200);
	st.Push(99);
	st.Push(22);
	st.Push(18); 
	st.Push(67);

	cout << st.Top() << endl;
	st.Pop();
	cout << st.Top() << endl;
	st.Pop();
	cout << st.Top() << endl;
	st.Pop();
	cout << st.Top() << endl;

	cout << "Test!" << endl;

	return 0;
}
发布了76 篇原创文章 · 获赞 30 · 访问量 5820

猜你喜欢

转载自blog.csdn.net/weixin_45926367/article/details/104888127
今日推荐