《数据结构与算法》练习题:堆栈ADT实现及应用

题目描述如下:

假设栈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

using namespace std;

#include

#include

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<<"空间申请错误!"<

    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<<'('<=11){
            if(x>=10){cout<<(char)(x-10+65);}
            else{cout<Pop(x);
    }
    cout<<')'<

你可能感兴趣的:(算法题)