问题描述 :
目的:使用C++模板设计顺序栈的抽象数据类型(ADT)。并在此基础上,使用顺序栈ADT的基本操作,设计并实现简单应用的算法设计。
内容:(1)请参照顺序表的ADT模板,设计顺序栈的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的顺序表ADT原型文件,自行设计顺序栈的ADT。)
(2)ADT的简单应用:使用该ADT设计并实现若干应用顺序栈的算法设计。
应用2:要求设计一个算法,使用顺序栈,设计并实现完成如下功能的算法:对于输入的任意一个非负十进制整数,屏幕输出与其等值的指定进制数。
(1)顺序栈ADT版本
参考函数原型:
template<class ElemType>
void Conversion(SqStack<ElemType> &S, int data, int format);
(形参data的含义:输入的任意一个非负十进制整数;format的含义:指定进制,如16进制即为16)
注意:若指定进制大于十进制,请注意对应进制字符的转换,如16进制的F对应十进制的15。
(2)STL的stack版本
参考函数原型:
template<class ElemType>
void Conversion(stack<ElemType> &S, int data, int format);
输入说明 :
第一行:任意一个非负十进制整数
第二行:指定进制
输出说明 :
第一行:指定进制的转换结果
一些废话:
很简单的一道题,采用了顺序栈,请放心食用(* ^_^ *)
#include <iostream>
#include <cmath>
#include <vector>
#include <cstring>
#include<algorithm>
#include <sstream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100//顺序栈存储空间的初始分配量
typedef int Status;
template<class SElemType>
class SqStack
{
private:
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
public:
SqStack()
{
base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
top = base; //top初始为base,空栈
stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
}
Status Push(SElemType e)
{// 插入元素e为新的栈顶元素
if (top - base == stacksize)
return ERROR; //栈满
*(top++) = e; //元素e压入栈顶,栈顶指针加1
return OK;
}
Status Pop(SElemType &e)
{//删除S的栈顶元素,用e返回其值
if (base==top)
return ERROR;//栈空
e = *(--top); //栈顶指针减1,将栈顶元素赋给e
return OK;
}
~SqStack( )
{
if (base)
{
delete []base;
}
}
SqStack<SElemType> operator=(SqStack<SElemType> &s);
SqStack(const SqStack<SElemType> &s);
Status GetTop(SElemType &e) //返回S的栈顶元素,不修改栈顶指针
{
if (top != base) //栈非空
{
e= *(top - 1); //返回栈顶元素的值,栈顶指针不变
return OK;
}
else
return ERROR;
}
};
char toElem(int num)
{
char letter;
if (0<=num&&num<=9)
letter='0'+num;
else
letter='A'+num-10;
return letter;
}
template<class ElemType>
void Conversion(SqStack<ElemType> &S,int data,int format)
{
int remain=0;
char elem;
while (data!=0)
{
remain=data%format;
elem=toElem(remain);
S.Push(elem);
data/=format;
}
while (S.Pop(elem)!=0)
{
cout<<elem;
}
cout<<endl;
}
int main()
{
SqStack<char> s;
int data,format;
cin>>data>>format;
Conversion(s,data,format);
}