栈的实现+进制转换

顺序栈的实现(SqStack, C++版)   作者不详
 
/* 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值