顺序栈的实现(SqStack, C++版)
2004-10-24 23:00
543 查看
/* 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;
}
#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;
}
相关文章推荐
- 线性表的顺序表示实现-C++版
- 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
- C++实现顺序栈之两栈共享存储空间
- C++实现顺序计算输入表达式的值
- C++ 顺序栈类实现
- 线性表顺序存储(C++ 实现)
- C++实现顺序栈的基本功能
- c++ 实现动态顺序表(拷贝构造 赋值运算符重载等操作)
- 【C++】实现动态顺序表的PushBack(),PopBack(),PushFront(),PopFront(),Find(),Insert
- C/C++函数参数的入栈顺序,计算顺序和可变参数的实现
- 数据结构之顺序表C++实现
- C++实现顺序队列
- 剑指offer刷题之c++实现的调整数组顺序使奇数位于偶数前面
- C++入门:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数
- C/C++练习题 (将n(n<20)个数按输入时顺序的逆序排列,用函数实现。)
- 【C++】顺序表的实现
- 线性表的顺序表示实现-C++版
- c++ 实现顺序栈类(初始化,入栈,退栈。读栈顶元素以及顺序输出栈顶指针与栈中的元素<<计算机软件技术基础 徐士良>>
- C++实现顺序栈类
- 链表的顺序表示和实现(C++模板类实现)