1.做了这个程序,实在是吐血,坑爹坑爹,因为要使用模板类,在vs中模板类的声明与实现一般我是分开用.h和.cpp文件分别实现的。模板类实际上不能声明与实现分开,后来在网上找到一篇博客,终于明白了QAQ分开的时候一直报错:
错误 LNK1120 1 个无法解析的外部命令 双栈共用存储空间 d:\documents\visual studio 2015\Projects\双栈共用存储空间\Debug\双栈共用存储空间.exe 1
错误 LNK2019 无法解析的外部符号 _main,该符号在函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中被引用 双栈共用存储空间 d:\documents\visual studio 2015\Projects\双栈共用存储空间\双栈共用存储空间\MSVCRTD.lib(exe_main.obj) 1
《C++编程思想》第15章(第300页)说明了原因:
模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。
作者:新一下的兰天
来源:优快云
原文:https://blog.youkuaiyun.com/maoliran/article/details/51871735
版权声明:本文为博主原创文章,转载请附上博文链接!
下面上类的声明和实现:
基本思路是静态变量中申请两个数组,t[0],b[0]为自下往上生长的栈,t[0]为栈顶,t[1],b[1]为自上往下生长的栈t[1]为栈顶
template<typename T>
class doubleStack {
private:
T *space;
int t[2], b[2];
int MAXN;
public:
doubleStack();
~doubleStack();
int push(T x, int i);
int pop(T *x, int i);
};
template<typename T>
int doubleStack<T>::pop(T *x, int i) {
if (t[i] == b[i])return 0;
*x = space[t[i]];
if (i == 0)t[0]--;
else t[1]++;
return 1;
}
//当i=0时对0号栈操作,当i=1时对1号栈操作
template<typename T>
int doubleStack<T>::push(T x, int i) {
if (t[0] + 1 == t[1])return 0;
if (i == 0)++t[0];
else --t[1];
space[t[i]] = x;
return 1;
}
template<typename T>
doubleStack<T>::doubleStack() {
MAXN = 50;
space = new T[MAXN];
t[0] = b[0] = -1;
t[1] = b[1] = MAXN;
}
template<typename T>
doubleStack<T>::~doubleStack() {
delete[MAXN]space;
}
测试代码:
#include<iostream>
#include"doubleStack.h"
using namespace std;
//template<typename T> 模板不能随便乱用,不然会报错
int main() {
doubleStack<int> s;
s.push(10, 0);
s.push(10, 0);
s.push(10, 1);
s.push(10, 1);
int x;
s.pop(&x, 0);
cout << x;
}