doubleStack的实现

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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值