栈是一种“先进后出”的数据结构,它具有如下操作: push,将元素压入栈中 pop,将栈顶元素弹出 size,返回栈中元素个数 empty,判断栈是否为空 现在要求利用标准库中的vector类实现栈,其声明如下: template<typename T> class Mystack{ private: vector<T> elems; public: void push(T&& e); void pop(T& e); int size() const; bool empty() const; }; 请实现该类,并通过相应的测试程序。 测试程序: #include<vector> #include<iostream> using namespace std; template<typename T> class Mystack{ private: vector<T> elems; public: void push(T&& e); void pop(T& e); int size() const; bool empty() const; }; /* 请在这里填写答案 */ int main() { Mystack<int> s; s.push(10); s.push(20); s.push(30); cout<<s.size()<<endl; while(!s.empty()) { int e; s.pop(e); cout<<e<<endl; } return 0; } 输入样例: 输出样例: 3 30 20 10。将类中的函数写在类外。
时间: 2023-06-24 07:08:12 浏览: 139
完整代码如下:
```cpp
#include<vector>
#include<iostream>
using namespace std;
template<typename T>
class Mystack {
private:
vector<T> elems;
public:
void push(T&& e);
void pop(T& e);
int size() const;
bool empty() const;
};
template<typename T>
void Mystack<T>::push(T&& e) {
elems.push_back(forward<T>(e));
}
template<typename T>
void Mystack<T>::pop(T& e) {
if (elems.empty()) {
throw out_of_range("stack is empty");
}
e = move(elems.back());
elems.pop_back();
}
template<typename T>
int Mystack<T>::size() const {
return elems.size();
}
template<typename T>
bool Mystack<T>::empty() const {
return elems.empty();
}
int main() {
Mystack<int> s;
s.push(10);
s.push(20);
s.push(30);
cout << s.size() << endl;
while (!s.empty()) {
int e;
s.pop(e);
cout << e << endl;
}
return 0;
}
```
注意,我们需要将函数的实现写在类外,并在函数名前面加上模板声明 `template<typename T>`。此外,在 `push` 函数中,我们使用了右值引用来避免拷贝。在 `pop` 函数中,我们使用了 `move` 来将栈顶元素移动到传入的参数中,避免了不必要的拷贝。同时,我们在 `pop` 函数中加入了越界检查,并抛出异常。
阅读全文