栈基本操作(顺序栈+数制转换)

#include<iostream>
#include<cstdlib>
using namespace std;

//定义初始化长度和每次增加的长度
const int STACK_INIT_SIZE=10;
const int STACK_INCREAMENT=2;

struct Stack{
    int* base;  //栈底
    int* top;   //栈顶
    int stacksize;  //已分配栈的大小
};

//函数声明
void show();//主界面
void InitStack(Stack &S);//初始化栈
void DestroyStack(Stack &S);//销毁栈
void ClearStack(Stack &S);//清空栈
int StackEmpty(Stack S);//判断栈是否为空
int StackLength(Stack S);//获取栈的长度
void GetTop(Stack S,int &e);//获取顶部元素
void Push(Stack &S,int e);//入栈
void Pop(Stack &S,int &e);//出栈
void StackVisit(Stack S);//从栈顶遍历栈
void Transfer(int n,int r,Stack &s);//数制转换


int main(){
    show();
    Stack s;
    int e,action;
    while(cin>>action){
        switch(action){
            case 1://初始化栈
                system("cls");
                InitStack(s);
                break;
            case 2://销毁栈
                system("cls");
                DestroyStack(s);
                break;
            case 3://清空栈
                system("cls");
                ClearStack(s);
                cout<<"栈已经被清空"<<endl<<endl;
                break;
            case 4://判断栈是否为空
                system("cls");
                StackEmpty(s);
                break;
            case 5://获取栈的长度
                system("cls");
                StackLength(s);
                break;
            case 6://获取顶部元素
                system("cls");
                GetTop(s,e);
                break;
            case 7://入栈
                system("cls");
                cout<<"请输入将压入栈的元素个数:"<<endl;
                int l;
                cin>>l;
                cout<<"请依次输入待压栈的元素:"<<endl;
                for(int i=0;i<l;i++){
                    cin>>e;
                    Push(s,e);
                }
                break;
            case 8://出栈
                system("cls");
                Pop(s,e);
                break;
            case 9://从栈顶遍历栈
                system("cls");
                StackVisit(s);
                break;
            case 10://数制转换
            	system("cls");
            	cout<<"请输入十进制数和需要转换为几进制数:"<<endl;
            	int n,r;
            	cin>>n>>r;
            	Transfer(n,r,s);
            	break;
            default:
                return 0;
        }
        system("pause");
        system("cls");
        show();
    }
    return 0;
}

//主界面
void show(){
    cout<<"+----------------------------------------+"<<endl;
    cout<<"|                                        |"<<endl;
    cout<<"|        1 ->初始化栈                    |"<<endl;
    cout<<"|        2 ->销毁栈                      |"<<endl;
    cout<<"|        3 ->清空栈                      |"<<endl;
    cout<<"|        4 ->判断栈是否为空              |"<<endl;
    cout<<"|        5 ->获取栈长度                  |"<<endl;
    cout<<"|        6 ->获取栈顶元素                |"<<endl;
    cout<<"|        7 ->压栈                        |"<<endl;
    cout<<"|        8 ->出栈                        |"<<endl;
    cout<<"|        9 ->遍历栈                      |"<<endl;
    cout<<"|        10->数制转换                    |"<<endl;
    cout<<"|        11->退出                        |"<<endl;
    cout<<"|                                        |"<<endl;
    cout<<"+----------------------------------------+"<<endl;
}

//初始化栈
void InitStack(Stack &S){
    S.base=new int[STACK_INIT_SIZE];
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    cout<<"栈已经初始化!"<<endl<<endl;
}

//销毁栈
void DestroyStack(Stack &S){
    delete S.base;
    cout<<"栈已经被销毁"<<endl<<endl;
}

//清空栈
void ClearStack(Stack &S){
    S.top=S.base;
}

//判断栈是否为空
int StackEmpty(Stack S){
    if(S.base==S.top){
        cout<<"栈为空"<<endl<<endl;
        return 1;
    } else {
        cout<<"栈不为空!"<<endl<<endl;
        return 0;
    }
}

//获取栈的长度
int StackLength(Stack S){
    cout<<"the length of the stack is "<<S.top-S.base<<endl<<endl;
    return S.top-S.base;
}

//获取顶部元素
void GetTop(Stack S,int &e){
    if(S.top==S.base){
        cout<<"栈为空,长度为0"<<endl<<endl;
    } else{
        e=*(S.top-1);
        cout<<"栈的长度为 "<<e<<endl<<endl;
    }
}

//入栈
void Push(Stack &S,int e){
    if(S.top-S.base>=S.stacksize){
        //在原有的空间上增加一段空间,用realloc(),具体使用方法请自行百度
        S.base=(int* )realloc(S.base,(S.stacksize+STACK_INCREAMENT)*sizeof(int));
        if(!S.base){
            cout<<"重新分配空间出错"<<endl<<endl;
        } else {
            S.top=S.base+S.stacksize;
            S.stacksize+=STACK_INCREAMENT;
        }
    }
    *(S.top++)=e;
    cout<<e<<" 已经压入栈"<<endl;
}

//出栈
void Pop(Stack &S,int &e){
    if(S.top==S.base){
        cout<<"栈为空"<<endl<<endl;
    } else {
        e=*--S.top;
        cout<<e<<" 已经出栈"<<endl;
    }
}

//从栈顶遍历栈
void StackVisit(Stack S){
    if(S.top==S.base){
        cout<<"栈为空"<<endl<<endl;
    }
    int e;
    while(S.top>S.base){
        //方法一
        cout<<*(--S.top)<<' ';
        //方法二
        //Pop(S,e);
    }
    cout<<endl;
}

//进制转换,将十进制的n转换为r进制的数
void Transfer(int n,int r,Stack &S){
    ClearStack(S);
    //n=(n/r)*r+n%r;
    while(n){
        Push(S,n%r);
        n=n/r;
    }
    cout<<"转换成功!转换后的"<<r<<"进制数为:"<<endl;
    while(S.top>S.base){
        cout<<*(--S.top);
    }
    cout<<endl<<endl;
}

 

posted @ 2016-10-21 22:20  寻觅beyond  阅读(2992)  评论(0编辑  收藏  举报
返回顶部