/* 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;
}