鱼C论坛

 找回密码
 立即注册

小甲鱼视频--C++快速入门--类模版--基于模版的栈代码保存

热度 4已有 482 次阅读2013-11-23 15:19 |个人分类:C++

//main.cpp
//Creat at 2013-11-23
//程序入口,控制栈的实现
//Created by Kaka
//Latest update:2013-11-23
//栈指针修改为有符号数

#include <iostream>
#include "ClassDef.h"

int main()
{
Stack<int>intStack(80);
int choice = NULL;
do //实现栈的循环处理
{
choice=Menushow();
switch(choice)
{
case 1: //入栈操作
{
std::cout<<"输入要入栈的数据:";
int num;
std::cin>>num;
intStack.push(num);
intStack.show();
break;
}
case 2: //出栈操作
{
intStack.pop();
intStack.show();
break;
}
case 3: //退出
{
;
}
}
}while(!choice||choice!=3);
return 0;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
//ClassDef.h
//Creat at 2013-11-23
//模版类的声明和定义,以及选择菜单函数的实现
//Created by Kaka
//Latest update:2013-11-23
//指针修改为有符号数
#ifndef CLASSDEF_H
#define CLASSDEF_H

template <class T>
class Stack //栈模版类定义
{
public:
Stack(unsigned int size = 100); //构造器
~Stack(); //析构器
void push(T value); //入栈函数
T pop(); //出栈函数
void show(); //栈显示

private:
int size;
int sp;
T *data;
};

template <class T>
Stack<T>::Stack(unsigned int size)
{
this->size=size;
data = new T[size];
sp=0;
}

template <class T>
Stack<T>::~Stack()
{
delete []data;
}

template <class T>
void Stack<T>::push(T value) //入栈函数
{
if(sp<=size)
data[++sp]=value;
else 
std::cout<<"栈已满,不能入栈,只能出栈!\n";
}

template <class T>
T Stack<T>::pop() //出栈函数
{
if(sp<=0)
{
std::cout<<"栈内无数据,请先入栈!\n";
return -1;
}
else
{
std::cout<<"出栈的数据是:"<<data[sp]<<std::endl;
return data[sp--];
}

}

template <class T>
void Stack<T>::show() //栈内容实时显示
{
if(sp<0)
{
std::cout<<"空栈!\n" ;
}
else
{
std::cout<<"栈内现在的数据为:";
for(int rp=sp;rp>0;rp--)
{
std::cout<<data[rp]<<"\t";
}
std::cout<<std::endl;
}
}

int Menushow() //菜单函数
{
int choose;
std::cout<<"选择操作:\t1、入栈\t2、出栈\t3、退出\n";
std::cin>>choose;
while(choose>3||choose<1)
{
std::cout<<"错误选择,重新选择:";
std::cin>>choose;
}
return choose;
}
#endif

路过

雷人
1

握手
2

鲜花

鸡蛋

刚表态过的朋友 (3 人)

发表评论 评论 (5 个评论)

回复 kaka12300wu 2013-11-23 16:38
@小甲鱼,这里有问题:
template <class T>
T Stack<T>::pop()         //出栈函数
{
if(sp<=0)
{
std::cout<<"栈内无数据,请先入栈!\n";
return -1;
}
else
{
std::cout<<"出栈的数据是:"<<data[sp]<<std::endl;
return data[sp--];
}
}
,求帮忙解决下这个返回值,因为这个返回值的存在,导致这个模版类不能处理所有的数据类型。
回复 kaka12300wu 2013-11-23 18:08
循环中出现的cin待输入流,一旦输入非法,则陷入死循环:
int Menushow()         //菜单函数
{
int choose;
std::cout<<"选择操作:\t1、入栈\t2、出栈\t3、退出\n";
std::cin>>choose;
while(choose>3||choose<1)
{
std::cout<<"错误选择,重新选择:";
std::cin>>choose;
}
return choose;
}
怎么破?
回复 1988 2013-11-26 20:24
第二个问题可以先std::cin.clear()先清除错误状态,然后再std::cin.ignore(100,'\n')跳过刚才的输入
回复 1988 2013-11-26 20:31
第一个问题可以将sp<=0的情况放在调用pop的函数中去写,这样能避免这个问题。但是sp是private变量,可以增加一个public的getSp()函数向外界提供一个访问sp的接口。
回复 kaka12300wu 2013-11-28 21:06
1988: 第二个问题可以先std::cin.clear()先清除错误状态,然后再std::cin.ignore(100,'\n')跳过刚才的输入
谢谢关注,我试试!

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 18:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部