zoukankan      html  css  js  c++  java
  • 栈基本操作(顺序栈+数制转换)

    #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;
    }
    
  • 相关阅读:
    Asp.Net服务器Cassini
    Vista系统Administrator帐户的激活与禁用
    SqlServer中的Top * With Ties
    SqlServer建远程服务连接
    SqlServer2005安装成功后补加Sa用户
    列出某个表中所有的列名
    水晶报表周期性打开报表失败
    Asp.net中文cookie的乱码问题
    HTML数据库编程、JavaScript数据库编程
    试图索引的限制
  • 原文地址:https://www.cnblogs.com/-beyond/p/5986253.html
Copyright © 2011-2022 走看看