c++非模板参数-用数组实现stack容器

头文件Stack_array.h

#pragma once

template<typename T, int MAXSIZE>
class Stack {
private:
	T elems[MAXSIZE];//包含元素的数组
	int numElems;//当前元素的个数

public:
	Stack();//构造函数
	void push(T const&);//入栈
	void pop();//出栈
	T top() const;//返回栈顶元素
	bool empty() const { return numElems == -1; }//返回栈是否为空
	bool full() const { return numElems == MAXSIZE; }//返回栈是否已满

};

#define __STACK_ARRAY__
#include "Stack_Array.cpp"

实现头文件Stack_array.cpp

#ifdef __STACK_ARRAY__

//默认构造
template<typename T, int MAXSIZE>
inline
Stack<T, MAXSIZE>::Stack() : numElems(-1) {}

//入栈
template<typename T, int MAXSIZE>
inline
void Stack<T, MAXSIZE>::push(T const& elem) {
	if (numElems == MAXSIZE){
		throw std::out_of_range("Stack<>::push() : stack is full");
	}
	elems[++numElems] = elem;
}

//出栈
template<typename T, int MAXSIZE>
inline
void Stack<T, MAXSIZE>::pop() {
	if (numElems == -1) {
		throw std::out_of_range("Stack<>::pop() : stack is empty");
	}
	--numElems;
}

//返回栈顶元素
template<typename T, int  MAXSIZE>
inline
T Stack<T, MAXSIZE>::top() const{
	if (numElems == -1) {
		throw std::out_of_range("Stack<>::top() : stack is empty");
	}
	return elems[numElems];
}

#endif // __STACK_ARRAY__

测试main.cpp

#include <iostream>
#include <string>
#include <deque>
#include "Stack_array.h"


int main()
{
    //非模板参数
    {
        try {
            Stack<int, 20> int20Stack; //可以存储20个int元素的栈
            Stack<std::string, 40> string40Stack; //可以存储40个string元素的栈

            //使用int20Stack
            int20Stack.push(10);
            int20Stack.push(20);
            std::cout << "int20Stack top is " << int20Stack.top() << std::endl;
            int20Stack.pop();
            std::cout << "int20Stack top is " << int20Stack.top() << std::endl;

            //使用string40Stack
            string40Stack.push("hello");
            string40Stack.pop();
            string40Stack.pop();
        }
        catch (std::exception const& ex) {
            std::cerr << "Exception: " << ex.what() << std::endl;
            return EXIT_FAILURE;
        }
    }


}


需要注意的是,浮点数(double)和类对象不能作为非模板参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值