关于栈的问题,求各位给出好的程序!!!!!!!!

zbslxq 2004-05-04 10:00:34
问题如下:
1. 利用类模板实现一个通用的栈模板。要求这个栈模板能够完成一般栈的基本操作(栈元素为基本数据类型,不包括指针、数组以及对象):向栈中压入一个元素(push)、取栈顶元素的值(top)、弹出栈顶元素(pop)、清空栈(empty)、判断栈是否为空(isEmpty)。
2. 编写一段主程序,要求主程序中生成整型、浮点型、字符型的栈实例各一个并分别测试其功能。
...全文
48 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
newegg2002 2004-05-04
楼上这个可比我好多了..楼主说的实例化,,我只实例化了char型一个..楼主看着比较用吧..
#include <iostream.h>
#include <process.h>
#define NULL 0
//预编译命令区
//-----------------------------------------------------------


template <class type>
class stack
{
private:
typedef struct node
{
type data;
node *next;

} listnode;

protected:

listnode *phead,*ptail;
int count;

public:

stack()
{
count=0;
phead=NULL;
ptail=NULL;
};

int length()

{
return count;
}
void push(type newdata)
{



listnode *pnew=new listnode;
pnew->data=newdata;
pnew->next=phead;
phead=pnew;
if(ptail==NULL)
ptail=pnew;
count++;

};
type peekhead()
{
listnode *ptemp=phead;
type tempdata=ptemp->data;
return tempdata;

};
type peektail()
{
return ptail->data;
}

void printstack()
{
listnode *temp=phead;
while(temp!=NULL)
{
cout<<temp->data<<ends;
listnode *tempdelete=temp;
temp=temp->next;
delete tempdelete;


}
}
};

//栈类模板实现区
//---------------------------------------------------------------------------

void main(void)
{
char data;


//对模板进行实例化为char型
cout<<"栈正在被实例化…………"<<endl;
cout<<endl;
cout<<"先进行入栈动作:"<<endl;
cout<<"您可以输入*号表示输入完毕:"<<endl;
stack<char>stack1;

for (int i=0;;i++)
{

cin>>data;
if(data!='*')

{
stack1.push(data);

}
else
{
cout<<"以下是您创建的栈的基本信息:"<<endl;
cout<<"它的长度为:"<<ends<<stack1.length()<<endl;
cout<<"它的栈顶元素为:"<<ends<<stack1.peekhead()<<endl;
cout<<"它的栈底元素为:"<<ends<<stack1.peektail()<<endl;
cout<<"现在执行出栈动作:"<<endl;
stack1.printstack();
}

}


}

//栈类模板实例化区
//---------------------------------------------------------------------------
  • 打赏
  • 举报
回复
dananhai 2004-05-04
这是我测试摸板队列的一个,包括template的继承
//template.h
#ifndef QUEUE_CLASS
#define QUEUE_CLASS

#include<iostream.h>
#include<stdlib.h>

//自定义类型声明
struct stutype{
char name[20];
int math;
int english;
int phisic;
};

struct teactype{
char name[20];
double salary;
};

//基类队列的声明
template<class T>
class Queue
{
protected:
int front,rear,count,length;
T *qlist;
public:
Queue(int size);
~Queue();
virtual void QInsert(void)=0;
virtual void QDelete(void)=0;
virtual void QFront(void)=0;
void ClearQueue(void);
int QLength(void)const;//const 是一种保证
void QEmpty(void);
void QFull(void);
};

//学生类队列声明
template <class T>
class student:public Queue<T>
{
public:
student(int size);
~student();
void QInsert(void);
void QDelete(void);
void QFront(void);
void stuinfo();
};

//教师类队列声明
template <class T>
class teacher:public Queue<T>
{
public:
teacher(int size);
~teacher();
void QInsert(void);
void QDelete(void);
void QFront(void);
void teachinfo();
};

//基类函数实现部分
template <class T>
Queue<T>::Queue(int size):front(0),rear(0),length(0)
{
qlist=new T[size+1];
if(!qlist){
cout<<"memory error!"<<endl;
exit(0);
}
count=size;
cout<<"Queue类构造函数被调用"<<endl;
}

//析构函数
template <class T>
Queue<T>::~Queue()
{
delete qlist;
cout<<"Queue类的析构函数被调用"<<endl;
}

//返回队列中元素个数
template <class T>
int Queue<T>::QLength(void)const
{
return length;
}

//输出队列是否为空
template <class T>
void Queue<T>::QEmpty(void)
{
(length==0)? cout<<"队列为空\n":cout<<"队列不空\n";

}

//输出队列是否为满
template <class T>
void Queue<T>::QFull(void)
{
(length==count)? cout<<"队列满\n":cout<<"队列未满\n";
}

//清空队列
template <class T>
void Queue<T>::ClearQueue(void)
{
front=0;
rear=0;
length=0;
cout<<"队列已清空"<<endl;
}

//学生类实现部分
template <class T>
student<T>::student(int size):Queue<T>(size)
{
cout<<"student类构造函数被调用"<<endl;
}
template <class T>
student<T>::~student()
{
cout<<"student类的析构函数被调用"<<endl;
}

//向对尾插入元素
template <class T>
void student<T>::QInsert(void)
{
if(length==count){
cerr<<"学生队列已满,不能添加!"<<endl;
return;
}
length++;
cout<<"请输入姓名:"<<endl;
cin>>qlist[rear].name;
cout<<"数学:"<<endl;
cin>>qlist[rear].math;
cout<<"英语:"<<endl;
cin>>qlist[rear].english;
cout<<"物理:"<<endl;
cin>>qlist[rear].phisic;
rear=(rear+1)%(count+1);
}

//删除对首元素,并显示其信息
template <class T>
void student<T>::QDelete(void)
{
if(length==0){
cerr<<"已无学生,不能删除!"<<endl;
return;
}
cout<<"您删除的是:"<<qlist[front].name<<" 同学,他的各科成绩是:"<<endl;
cout<<"数学:"<<qlist[front].math<<"英语:"<<qlist[front].english<<"物理:"<<qlist[front].phisic<<endl;
length--;
front=(front+1)%(count+1);
}

//访问队首元素,并显示其信息
template <class T>
void student<T>::QFront(void)
{
if(length==0){
cerr<<"学生队中已无人!"<<endl;
return;
}
cout<<"队列中第一个同学是:"<<qlist[front].name<<"。他的各科成绩是:"<<endl;
cout<<"数学:"<<qlist[front].math<<"英语:"<<qlist[front].english<<"物理:"<<qlist[front].phisic<<endl;
}

//打印队列中所有学生的信息及平均成绩
template <class T>
void student<T>::stuinfo()
{int tfront=front,trear=rear;
cout<<"姓名 数学 英语 物理 平均成绩 "<<endl;
while(tfront!=trear){
double sum=qlist[tfront].math+qlist[tfront].english+qlist[tfront].phisic;
cout<<qlist[tfront].name<<" "
<<qlist[tfront].math<<" "
<<qlist[tfront].english<<" "
<<qlist[tfront].phisic<<" "<<sum/3<<endl;
tfront=(tfront+1)%(count+1);
}
}

//教师类实现部分
template <class T>
teacher<T>::teacher(int size):Queue<T>(size)
{
cout<<"teacher类构造函数被调用"<<endl;
}

template <class T>
teacher<T>::~teacher()
{
cout<<"teacher类的析构函数被调用"<<endl;
}

//向对尾插入元素
template <class T>
void teacher<T>::QInsert(void)
{
if(length==count){
cerr<<"教师队列已满,不能添加!"<<endl;
return;
}
length++;
cout<<"请输入姓名:"<<endl;
cin>>qlist[rear].name;
cout<<"月薪:"<<endl;
cin>>qlist[rear].salary;
rear=(rear+1)%(count+1);
}

//删除对首元素,并显示其信息
template <class T>
void teacher<T>::QDelete(void)
{
if(length==0){
cerr<<"已无教师,不能删除!"<<endl;
return;
}
cout<<"您删除的是:"<<qlist[front].name<<" 老师,他的月薪是:"<<qlist[front].salary<<endl;
length--;
front=(front+1)%(count+1);
}

//访问队首元素,并显示其信息
template <class T>
void teacher<T>::QFront(void)
{
if(length==0){
cerr<<"队中已无人!"<<endl;
return;
}
cout<<"队列中第一位教师是:"<<qlist[front].name<<"。他的月薪是:"<<qlist[front].salary<<endl;
}

//打印队列中所有教师的信息及年薪
template <class T>
void teacher<T>::teachinfo()
{int tfront=front,trear=rear;
cout<<"姓名 月薪 年薪 "<<endl;
while(tfront!=trear){
cout<<qlist[tfront].name<<" "
<<qlist[tfront].salary<<" "
<<qlist[tfront].salary*12<<endl;
tfront=(tfront+1)%(count+1);
}
}
#endif //QUEUE CLASS
//======================================================================
//test.cpp
//======================================================================
#include "template.h"
int main(void)
{
char choise;
int n,flag;

cout<<"输入你想创建的教师个数:";
cin>>n;
teacher<teactype> jiaoshi(n);

cout<<"输入你想创建的学生个数:";
cin>>n;
student<stutype> xuesheng(n);

cout<<"请选择先对谁操作:0:退出 1:学生 2:教师"<<endl;
cin>>flag;
while(flag!=0){
switch(flag){
case 1:cout<<"请选择"<<endl;
cin>>choise;
while(choise!='q'){
switch(choise){
case 'i':
xuesheng.QInsert();break;
case 'd':
xuesheng.QDelete();break;
case 't':
xuesheng.QFront();break;
case 'c':
xuesheng.ClearQueue();break;
case 'l':
cout<<"队列中有:"<<xuesheng.QLength()<<"个学生"<<endl;break;
case 'f':
xuesheng.QFull();break;
case 'e':
xuesheng.QEmpty();break;
case 'p':
xuesheng.stuinfo();break;
case 'h':
cout<<"i:插入;d:删除;l:对长;e:满否;f:空否;t:对头;c:清空;q:退出本次操作;p:所有信息;h:帮助"
<<endl; break;
default:
cout<<"您的输入有误,按h键查看帮助"<<endl;break;
}
cout<<"请选择:";
cin>>choise;
}break;
case 2:cout<<"请选择"<<endl;
cin>>choise;
while(choise!='q'){
switch(choise){
case 'i':
jiaoshi.QInsert();break;
case 'd':
jiaoshi.QDelete();break;
case 't':
jiaoshi.QFront();break;
case 'c':
jiaoshi.ClearQueue();break;
case 'l':
cout<<"当前队列中有:"<<jiaoshi.QLength()<<"个教师。"<<endl;break;
case 'f':
jiaoshi.QFull();break;
case 'e':
jiaoshi.QEmpty();break;
case 'h':
cout<<"i:插入;d:删除;l:对长;e:满否;f:空否;t:对头;c:清空;q:退出本次操作;p:所有信息;h:帮助"
<<endl;break;
case 'p':
jiaoshi.teachinfo();break;
default:
cout<<"您的输入有误,按h键查看帮助"<<endl;break;
}
cout<<"请选择:";
cin>>choise;
} break;
default:cout<<"您的输入有误!"<<endl;
}
cout<<"请选择先对谁操作:0:退出 1:学生 2:教师"<<endl;
cin>>flag;
}
return 0;
}
  • 打赏
  • 举报
回复
zbslxq 2004-05-04
能不能快点?
我得比较一下,哪个比较好:)
先谢谢了
  • 打赏
  • 举报
回复
newegg2002 2004-05-04
以前作过一个。待会儿拿上来,,
  • 打赏
  • 举报
回复
zbslxq 2004-05-04
谢谢了
  • 打赏
  • 举报
回复
cngdzhang 2004-05-04
给你一个队列的,堆栈的差不多的,不直接给是想抛砖引玉 :)
这个队列模板已经严格测试过

//队列节点
template<class T>
class QueueNode
{
public:
T nodeData;//节点数据
QueueNode *next;//指向下一个节点
public:
QueueNode(){};
virtual ~QueueNode(){};

};

//一个普通队列模板
template<class T>
class MyQueue
{
//head指向的是队尾,head->next指向的是队头
//即队尾的下一个元素就是队头
//这是一个只使用一个指针的队列环
QueueNode<T> *head;//使用一个指针
int size;//队列的大小
public:
MyQueue(){head=NULL;size=0;}//初始化,队列为空,大小为零
virtual ~MyQueue(){clear();}//析构函数
int getSize(){return size;}//取得队列的大小,即含元素的个数
void clear()//队列清空
{
QueueNode<T> *p,*q;
//遍历并删除节点
if(head!=NULL)//如果队列不为空
{
p=head->next;
head->next=NULL;
while(p){q=p->next;delete p;p=q;}
head=NULL;//队列置为空
}
size=0;//大小为零
}
void append(T &data)//往队尾添加元素
{
size++;//大小加1
QueueNode<T> *node=new QueueNode<T>;//分配一个新的节点
node->nodeData=data;//保存节点数据
if(head==NULL)//如果队列为空
{
head=node;//头节点指向这个节点
node->next=node;//队尾指向队头
}
else//否则,队列不为空
{
node->next=head->next;//新节点的next指向队头
head->next=node;//插入新节点到队尾
head=node;//head指向队尾
}
}
int get(T &data)//从队头取出一个元素,要删除元素
{
QueueNode<T> *p;
if(head!=NULL)//如果队列不为空
{
data=head->next->nodeData;//取得队头节点保存的数据
p=head->next;//指向头节点,准备删除
if(head==p) head=NULL;//如果队中只有一个节点,则队列删除节点后为空
else head->next=p->next;//否则,只是简单移动指针
delete p;//删除节点
size--;//队列大小减1
return 1;//操作成功返回1
}
return 0;//失败,返回0
}
BOOL getByIndex(T &data,int index)//通过索引取得节点,不删除节点
{
int i=0;
QueueNode<T> *p;
if(index<0) return FALSE;//如果下标为负数,返回失败
if(head==NULL) return FALSE;//如果队列为空,返回失败
//循环查找
p=head->next;
while(i<index && p!=head){p=p->next;i++;}
if(i<index) return FALSE;//如果没找到。返回失败
else //否则,正确返回
{
data=p->nodeData;
return TRUE;
}
return FALSE;
}
};

  • 打赏
  • 举报
回复
freefalcon 2004-05-04
这样的程序很多啊
首先库里面有现成的
再次,很多将C++的书都有模拟代码,比如C++ Primer
  • 打赏
  • 举报
回复
simouse 2004-05-04
STL里有现成的。
  • 打赏
  • 举报
回复
chenqing1128 2004-05-04
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.1w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
申请成为版主
帖子事件
创建了帖子
2004-05-04 10:00
社区公告
暂无公告