/* 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) +