每日一题18:栈

用C++写了一个栈模板,其间用了一些《Effective C++》的准则,记录在这里喽。这个类还没有做到异常安全,以后改进!

Stack.h文件。

#ifndef _STACK_H_
#define _STACK_H_

namespace MyDataStructure
{
    template <typename T>
    class Stack
    {
    private:
        int Capacity;
        int Top;
        T* Vals;

        bool null()
        {
            return Capacity == 0;
        }
        void init(int capacity)
        {
            Capacity = capacity;
            Top = 0;
            Vals = new T[capacity];
        }
        void copy(const Stack& s)
        {
            Capacity = s.Capacity;
            Top = s.Top;
            Vals = NULL;
            if(s.Capacity != 0)
            {
                Vals = new T[Capacity];
                memcpy(Vals,s.Vals,Capacity*sizeof(T));
            }
        }

        void destroy()
        {
            if(Vals != NULL) delete []Vals;
            Top = 0;
            Capacity = 0;
        }
    public:
        Stack() : Capacity(0),Top(0),Vals(NULL){};
        Stack(int capacity)
            :Capacity(capacity),Top(0)
        {
            Vals = new T[capacity];
        }
        Stack(const Stack& s)
        {
            copy(s);
        }
        Stack& operator = (const Stack& s)
        {
            if(this == &s) return *this;
            destroy();
            copy(s);
            return *this;
        }
        ~Stack()
        {
            destroy();
        }
        bool resize(int capacity)
        {
            if(capacity <= 0) return false;
            if(capacity == Capacity) return true;
            if(!null())
            {

                T* vals = new T[capacity];
                if(capacity >= Top)
                {
                    memcpy(vals,Vals,Top*sizeof(T));
                }
                else
                {
                    memcpy(vals,Vals,capacity*sizeof(T));
                    Top = capacity;
                }
                Capacity = capacity;
                delete []Vals;
                Vals = vals;
            }
            else
                init(capacity);
            return true;
        }
        bool push(T val)
        {
            if(!full() && !null())
            {
                Vals[Top++] = val;
                return true;
            }
            return false;
        }
        bool pop(T& val)
        {
            if(!null() && !empty())
            {
                val = Vals[--Top];
                return true;
            }
            return false;
        }
        bool top(T &val)
        {
            if(!null() && !empty())
            {
                val = Vals[Top - 1];
                return true;
            }
            return false;
        }
        void clear()
        {
            Top = 0;
        }
        void size()
        {
            return Top;
        }
        bool empty()
        {
            return Top == 0;
        }
        bool full()
        {
            return Top == Capacity;
        }

    };

}
#endif 

下面是测试函数:

StackTest.cpp

// StackTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Stack.h"
#include <iostream>

using namespace MyDataStructure;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    Stack<int> s1(10);
    for (int i = 1; i < 11; ++i)
    {
        s1.push(i);
    }

    Stack<int> s2(s1);
    s1.resize(20);
    for (int i = 1; i < 11; ++i)
    {
        int val;
        if(s1.pop(val))
        {
            cout<<val<<‘ ‘;
        }
    }
    cout<<endl;

    for (int i = 1; i < 11; ++i)
    {
        int val;
        if(s2.pop(val))
        {
            cout<<val<<‘ ‘;
        }
    }
    cout<<endl;
    return 0;
}
时间: 2024-07-28 14:38:21

每日一题18:栈的相关文章

老男孩教育每日一题-2017年5月18日-说说|(管道)与|xargs(管道xargs)的区别

1.题目 2.参考答案 find  |xargs ls -ld##把前一个命令的结果,通过管道传递给后面的命令(ls -ld),传递的是文件名find  | 命令    ##把前一个命令的结果,通过管道传递给后面的命令,传递的是普通的文本,文字,字符串 测试方法1-sed -i参数 sed -i参数修改文件内容,后面必须要加上文件名否则会报错.no input file [[email protected] ~]# find  /oldboy/ -type f  -name "*.sh"

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景: 生成9*9乘法表 [[email protected] ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2   2x2=4 1x3=3   2x3=6   3x3=9 1x4=4   2x4=8   3x4=12  4x4=16 1x5=5

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-17 09:29:

C语言每日一题之No.9

再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出"abdefghjkmnptwy". 二.思路:既然是已经排好序的,就用二分法查找的思想 将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入 三.程序 1 #include <stdio.h> 2 #include <string.

C语言每日一题之No.1

鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C这东西毕竟是练出来的,所以从今天开始,每日一道C语言题目,从题目入手来补知识漏洞.题目比较基础,如不堪入目,还请见谅. 题目:输入三个整数,输出最大的数 思路:定义三个变量用来存储输入的整数 比较三个变量的大小,找到最大的数 定义一个变量存储来存储最大的数 程序: 1 #include <stdio

老男孩教育每日一题-第87天-Nginx需要优化哪些内容?

参考答案: 1.gzip压缩优化2.expires缓存优化3.网络IO事件模型优化4.隐藏软件名称和版本号5.防盗链优化6.禁止恶意域名解析7.禁止通过IP地址访问网站.8.HTTP请求方法优化.9.防DOS攻击单IP并发连接的控制,与连接速率控制.10.严格设置Web站点目录的权限.11.将Nginx进程以及站点运行于监牢模式(nginx服务降权启动(不能使用80端口,使用其他端口,例如8080).站点目录设置普通用户).12.通过robot协议以及HTTP_USER_AGENT防爬虫优化13

C语言每日一题之No.8

正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个月总有这么几天的....晚上闺蜜打电话来,共同探讨了作为单身女性身在一线城市的生活,互相安慰互相关心,心里一下子就温暖了许多.总在这个时候,你会觉得,这个冷静的城市里你不是一个人在行走,还有另一颗心牵挂着你.嘿嘿,回来该学习还学习.现在不管坚持是对的还是错的,你都踏上了研发这条不归路,那就一条黑走到

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

老男孩教育每日一题-第83天-binlog是什么?记录的什么?有几种工作模式及企业应用场景

参考答案 含义 binlog:是用于记录所有更新了数据的操作语句,语句以事件的形式保存,它描述数据的更改过程作用:用于实时备份数据,数据库的主从复制log_bin 打开记录binlog功能 binlog的查看 mysqlbinlog /home/mysql/binlog/binlog.000003 binlog的删除:可分为自动与手动删除 自动删除 能过binlog参数expire_logs_days来实现 show binary logs; show variables like "expir