顺序栈的实现(SqStack, C++版)

原创 2004年10月24日 23:00:00

/* stack.h */
#ifndef __SQSTACK_H__
#define __SQSTACK_H__ 1

#include <iostream.h>

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__ */

////////////////////////////////////////////////////////////////////
// stacktest.cpp
#include <iomanip.h>
#include "stack.h"

void main()
{
    Stack<char *>   s1(10), s2(10);
    char    *weekday[] = {
        "Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun" };
    for (register int i = 0; i < 7; i++)
        s1.Push(weekday[i]);
    cout << "==========s1==========" << endl;
    for (i = 0; i < 7; i++) {
        cout << setw(5) << s1.Peek();
        s2.Push(s1.Pop());
    }
    cout << endl;
    cout << "==========s2==========" << endl;
    for (i = 0; i < 7; i++)
        cout << setw(5) << s2.Pop();
    cout << endl;

    char    s[80];
    cout << DecimalConversion(1024, 2, s) << endl;
}

第五周项目5-后缀表达式(选做)

/*    * 烟台大学计算机与控制工程学院    * 作者:王雪松   * 完成日期:2016年9月29日    * 问题及代码 * 问题描述:利用sqstack.h中...
  • DACBE
  • DACBE
  • 2016年09月29日 10:56
  • 262

第6周项目1-建立顺序栈算法库

问题: /* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:项目1.cbp 作    者:王聪 完成日期:201...
  • qlwangcong518
  • qlwangcong518
  • 2015年10月05日 16:40
  • 407

栈和队列(一)——栈——建立顺序栈算法库

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 建立顺序栈算法库.cpp *作 者...
  • zzh_569754126
  • zzh_569754126
  • 2015年11月13日 21:19
  • 1639

顺序栈的实现SqStack

#include #include #include //建立顺序栈 #define STACK_INIT_SIZE 100 #define STACKINCRESEMENT 10 typedef i...
  • liuyongvs2009
  • liuyongvs2009
  • 2014年03月28日 21:02
  • 387

C++ 顺序栈(类模板实现)

#include "stdafx.h" #include #include using namespace std; ///////////////////////////////////////...
  • thisnameokbu
  • thisnameokbu
  • 2014年06月12日 18:41
  • 572

C++实现顺序栈

VS2013下实现#include #include using namespace std; const int StackSize = 20; template class Stack{ p...
  • u013059120
  • u013059120
  • 2015年07月03日 15:38
  • 858

C++实现顺序栈的基本功能

栈是限定仅在表头进行插入和删除操作的线性表,有着先进后出的特点(FILO); 现在我来动手实现栈的基本本功能练练手; 定义栈的头文件如下: #ifndef CSTOCK_H_ #define C...
  • qinmusiyan
  • qinmusiyan
  • 2014年10月07日 13:30
  • 9029

顺序栈的c++实现

栈的定义以及对栈的操作在mystack.h中实现#ifndef MYSTACK_H #define MYSTACK_H template class Mystack { public: Mys...
  • adminabcd
  • adminabcd
  • 2015年06月16日 15:57
  • 724

[数据结构]栈之顺序栈的类模板实现

栈的数组实现形式,采用动态分配数组,不够时可以调整栈的大小。 Stack.h文件:主要定义栈的抽象基类,提供公共的接口函数。 #ifndef STACK #define STACK //栈...
  • u013467442
  • u013467442
  • 2015年06月20日 15:48
  • 1303

栈(顺序存储)C++模板实现

#include using namespace std; template class stack{ private: int top; //栈顶指针 int maxLen; //...
  • iamgaowei
  • iamgaowei
  • 2014年04月08日 21:46
  • 1353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:顺序栈的实现(SqStack, C++版)
举报原因:
原因补充:

(最多只允许输入30个字)