大家贴个顺序栈的实现代码吧,C++版的

lrd408 2008-04-10 11:43:13
大家贴个顺序栈的实现代码吧,C++版的!!!!!!!!!!!
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrossYourSoul 2009-11-19
  • 打赏
  • 举报
回复
第一次来!csdn很强大。
hellodudu 2008-04-11
  • 打赏
  • 举报
回复

//vecStack.h
#ifndef VEC_STACK_H
#define VEC_STACK_H

#include <vector>
using std::vector;

template<class T, int capacity = 30>
class vecStack
{
private:
vector<T> pool;
public:
vecStack()
{
pool.reserve(capacity);
}
void Clear()
{
pool.clear();
}
bool isEmpty() const
{
return pool.empty();
}
T& topEl()
{
return pool.back();
}
T pop()
{
T el = pool.back();
pool.pop_back();
return el;
}
void push(const T& el)
{
pool.push_back(el);
}
};

#endif

zgjxwl 2008-04-11
  • 打赏
  • 举报
回复
//main.cpp
#include <iostream>
#include "Stack.h"
using namespace std;
enum ResultCode {Nomemory,OutOfBounds,Underflow,Overflow,Duplicate};
void main()
{
try
{
SeqStack<double> dstk(2); //构造一个容量为2的双精度数栈
dstk.Push(3.7);
dstk.Push(8.8); //向栈中依次加入3.7和8.8
cout<<dstk; //输出栈中元素
dstk.Pop();
if(dstk.IsEmpty()) //判定栈是否为空
cout<<"Is empty!"<<endl;
else
cout<<"Is not empty!"<<endl;
dstk.Pop(); //两次删除运算,将产生下溢异常
dstk.Pop();
}
catch(ResultCode err)
{
switch(err) //根据异常类别,处理异常
{
case Overflow:
cout<<"Overflow!"<<endl;
break;
case Underflow:
cout<<"Underflow!"<<endl;
break;
}
}
}

//Stack.h
#include <ostream>
//ostream是包含在头文件ostream里的,也是标志符,要使用命名空间或者std::ostream才可以用
using namespace std;
//基类Stack的定义
template <class T>
class Stack
{
public:
virtual void Push(const T&x)=0;
virtual void Pop()=0;
virtual T Top()const=0;
virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
};

//派生类SeqStack的定义
template <class T>
class SeqStack:public Stack<T>
{
public:
SeqStack(int mSize);
~SeqStack(){delete []s;}
bool IsEmpty() const {return (top==-1);}
bool IsFull() const {return (top==maxSize-1);}
void Push(const T&x);
void Pop();
T Top()const;
void Output(ostream& out)const;
private:
//void Output(ostream& out)const;
T *s;
int maxSize;
int top;
friend ostream &operator<<(ostream &out,const SeqStack<T>&s);
};


//Stack.cpp
//#include "Stack.h"
//构造函数的实现
template <class T>
SeqStack<T>::SeqStack(int mSize)
{
maxSize=mSize;
s=new T[maxSize];
top=-1;
}

//进栈函数的实现
template <class T>
void SeqStack<T>::Push(const T &x)
{
if (IsFull()) throw Overflow;
s[++top]=x;
}

//出栈函数的实现
template <class T>
void SeqStack<T>::Pop()
{
if (IsEmpty()) throw Underflow;
top--;
}

//返回栈顶元素的函数的实现
template <class T>
T SeqStack <T>::Top()const
{
if (IsEmpty()) throw Underflow;
return s[top];
}

//输出栈中所有元素的函数实现
template <class T>
void SeqStack <T>::Output(ostream &out)const
{
int i=top;
out<<endl<<"Stack contains:";
while (i!=-1) out<<s[i--]<<" ";
out<<endl;
}

//
template <class T>
ostream &operator<<(ostream& out,const SeqStack<T>&s)
{
s.Output(out);
return out;
}
lrd408 2008-04-11
  • 打赏
  • 举报
回复
一楼的能不能教教怎么看啊
lrd408 2008-04-11
  • 打赏
  • 举报
回复
回二楼,是简单的的操作,什么都可以
zgjxwl 2008-04-10
  • 打赏
  • 举报
回复
要实现什么样的操作?
kimiya25 2008-04-10
  • 打赏
  • 举报
回复
用vector包装一下就是stack的实现了, 看vector源代码就行了
forckgcs 2008-04-10
  • 打赏
  • 举报
回复
#ifndef __SQSTACK_H__
  #define __SQSTACK_H__ 1
  #include <iostream>
  extern "C" { void exit(int); }
  const int nDefaultStackSize = 50; //缺省Stack元素个数
  //以下为栈的顺序存储结构(顺序栈)的C++类定义
  template <class T> //声明为模板类
  class Stack {
  private:
   T *stacklist; //存放栈元素的指针
   int stacksize; //存放栈(数组)大小
   int top; //指示栈顶元素的位置(数组下标)
  public:
   //构造函数
   Stack(int initSize = nDefaultStackSize) {
   if (initSize < 1) initSize = nDefaultStackSize;
   stacklist = new T[initSize]; //为stacklist分配存储空间
   if (!stacklist) {
   cerr << "为Stack分配存储空间失败!程序将终止。"
   << endl;
   exit(1);
   }
   stacksize = initSize; //初始化栈大小
   top = -1; //初始化栈顶位置
   }
   //析构函数
   ~Stack() {
   if (stacklist) delete [] stacklist;
   stacksize = 0;
   top = -1;
   }
   //判断栈是否为空
   int StackEmpty() const {
   return top < 0; //top == -1;
   }
   //判断是否栈满
   int StackFull() const {
   return top == stacksize - 1;
   }
   //返回栈中元素个数
   int StackLength() const {
   return top + 1;
   }
   //压栈
   void Push(const T& item) {
   if (top >= stacksize - 1) {
   cerr << "栈已满,无法继续压栈操作!" << endl;
   return;
   }
   top ++; //修改栈顶位置(下标)
   stacklist[top] = item; //类型T需支持=运算符
   }
   //出栈
   T Pop() {
   T temp;
   if (top >= 0) {
   temp = stacklist[top]; //转存栈顶元素取值
   top --; //修改栈顶位置
   }
   else
   cerr << "栈为空,无法继续出栈操作!" << endl;
   return temp;
   }
   //读取栈顶元素
   T Peek() const {
   T returnValue;
   if (top >= 0)
   returnValue = stacklist[top];
   else
   cerr << "栈为空,无法读取栈顶元素!" << endl;
   return returnValue;
   }
   //清空栈
   void ClearStack() {
   top = -1; //栈顶位置复位
   }
  };
  //将十进制数num转换成toSys(2--36)进制的值(以字符串形式存入destNum并返回)
  char *DecimalConversion(unsigned long num, unsigned char toSys, char destNum[])
  {
   if (!destNum) return NULL;
   Stack<int> S(80);
   unsigned char i = 0;
   int item;
   if (toSys<2 || toSys>36) { destNum[0] = '\0'; return destNum; }
   while (num) {
   S.Push(num % toSys);
   num = num / toSys;
   }
   while (!S.StackEmpty()) {
   item = S.Pop();
   destNum[i] = (unsigned char)(item) +
   (item<10 ? '0' : ('a'-10));
   i++;
   }
   destNum[i] = '\0';
   return destNum;
  }
  #endif /* !__SQSTACK_H__ */

63,594

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下