题目描述如下:
假设栈ADT的数据元素为整数,栈ADT的实现采用顺序存储结构。现要用栈来辅助完成任意非负十进制整数到Base(Base不大于35)进制的转换。部分代码已经给出,请补充完善栈溢出处理函数和主函数。 注意:只提交需要补充的函数,其他代码不允许自己重写和修改。
栈溢出处理函数overflowProcess:当栈满时,将栈的空间在原来基础上扩大1倍。
主函数: 输入一个非负十进制整数n及要转换的进制Base,输出其转换后的进制形式,以及长度。输出格式如下:
($...$)10=(#...#)Base
Length=转换进制后数的位数
其中$...$是输入的十进制数n,#...#是转换得到的Base进制数,如果转换后位码多于1位,则用大写字母A,B,...等表示,10-A, 11-B,......
例如,输入:1024 2
输出:(1024)10=(10000000000)2
Length=11
再如,输入: 25 30
输出:(25)10=(P)30
Length=1
预置代码如下:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
class SeqStack
{ //顺序栈类定义
private:
ElemType *elements; //数组存放栈元素
int top; //栈顶指示器
int maxSize; //栈最大容量
void overflowProcess(); //栈的溢出处理
public:
SeqStack(int sz); //构造函数
~SeqStack() { delete []elements; }; //析构函数
void Push(ElemType x); //进栈
int Pop(ElemType &x); //出栈
int IsEmpty() const { return top == -1; }
int IsFull() const { return top == maxSize-1; }
int GetSize() const {return top+1;}
};
SeqStack::SeqStack(int sz)
{ elements=new ElemType[sz]; //申请连续空间
if(elements==NULL) {cout<<"空间申请错误!"<<endl;exit(1);}
else { top=-1; //栈顶指示器指向栈底
maxSize=sz; //栈的最大空间
};
};
/*
**********************************************************
补充overflowProcess() 函数
**********************************************************
*/
void SeqStack::Push(ElemType x)
{ //若栈满,则溢出处理,将元素x插入该栈栈顶
if (IsFull() == 1) overflowProcess(); //栈满
elements[++top] = x; //栈顶指针先加1, 再元素进栈
};
int SeqStack::Pop(ElemType & x)
{//若栈不空,函数退出栈顶元素并将栈顶元素的值赋给x,
//返回true,否则返回false
if (IsEmpty() == 1) return 0;
x = elements[top--]; //先取元素,栈顶指针退1
return 1; //退栈成功
};
/*
**************************************************************
补充mian()函数
**************************************************************
*/
这道题要求补充overflow函数和和主函数,overflow函数很简单,因为判断是否溢出的函数题目给的代码中已经实现,只需要根据该函数的返回值判断是否溢出,然后将栈扩大两倍即可(习惯上都是扩大两倍),因为这个栈是顺序存储,所以扩展很简单,下面给出扩展的代码:
void SeqStack::overflowProcess(){
maxSize = maxSize*2 + 1;
}
主函数也很简单,就是实现十进制转各种进制,如果是十进制转二进制,只需要用目标的十进制数每次mod 2,余数从右向左排列即可,十进制转其他进制也是一样的思路,下面给出主函数的代码:
int main(){
int n,base;
int temp;
int x;
SeqStack *result=new SeqStack(1050);//定义一个堆栈,用来存储余数
cin>>n>>base;//输入十进制数和要转的进制
temp = n;
int length=0;
if(n==0){result->Push(0);}
while(n!=0){//while循环,每次取余,将余数压入堆栈中,直到n变成0
result->Push(n%base);
n = n/base;
length++;
}
int t = result->Pop(x);
cout<<'('<<temp<<')'<<10<<'='<<'(';
while(t!=0){//按照要求输出结果
if(base>=11){
if(x>=10){cout<<(char)(x-10+65);}
else{cout<<x;}
}
else{cout<<x;}
t = result->Pop(x);
}
cout<<')'<<base<<endl;
cout<<"Length="<<length<<endl;
return 0;
}