顺序栈10种操作的实现

操作

时间复杂度(T(n))

空间复杂度(S(n))

判断是否为空

O(1)

O(1)

得到长度

O(1)

O(1)

得到栈顶元素

O(1)

O(1)

压入元素

O(1)

O(1)

不需要开辟新内存或者开辟为常量的内存

弹出元素

O(1)

O(1)

反转顺序栈

O(n)

O(1)

冒泡排序

O(n^2)

O(1)

/*   数据结构分析与学习专栏
*  Copyright (c) 2015, 山东大学计算机科学与技术专业学生
*  All rights reserved.
*   作    者:   高祥
*   完成日期:  2015 年 4 月 3 日
*   版 本 号:007
 
*任务描述:针对顺序栈,实现10个基本操作
*   1:建立顺序栈
*   2:判断顺序栈是否为空
*   3:求顺序栈的元素个数
*   4:输出顺序栈
*   5:得到顺序栈的栈顶元素
*   6:压入元素
*   7:弹出元素
*   8:反转当前顺序栈
*   9:将顺序栈升序排序
*  10:清空顺序栈
 
*主要函数:
*  1.Status InitStack(SqStack &s);//初始化栈:为栈分配初始空间
*  2.void ReverseCreatStack(SqStack &s);//逆序创建栈
*  3.Status IsEmpty(SqStack s);//判断栈是否为空
*  4.int StackLength(SqStack s);//求栈的元素个数
*  5.void Output(SqStack s);//输出栈的元素
*  6.void GetTop(SqStack s);//得到栈顶元素
*  7.void Push(SqStack &s,ElemType elem);//压入元素
*  8.void Pop(SqStack &s);//弹出元素
*  9.void ReverseStack(SqStack &s);//反转栈
*  10.void SortStack(SqStack &s);//栈元素排序
*  11.void ClearStack(SqStack &s);//清空栈
*/
 
#include<iostream>
#include<cstdlib>
using namespace std;
 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define FALSE 0
 
typedef int Status;
typedef int ElemType;
 
typedef struct
{
   ElemType *base;//栈底指针:指向栈最底的元素(非空时)
   ElemType *top;//栈顶指针:始终在栈顶元素的下一个位置(即:*(MyStack.top-1)是栈顶元素)
   int stackcapacity;//栈的当前容量
   int stacklength;//栈的当前元素个数
} SqStack;
 
Status InitStack(SqStack&s);//初始化栈:为栈分配初始空间
 
void ReverseCreatStack(SqStack&s);//逆序创建栈
 
Status IsEmpty(SqStack s);//判断栈是否为空
 
int StackLength(SqStack s);//求栈的元素个数
 
void Output(SqStack s);//输出栈的元素
 
void GetTop(SqStack s);//得到栈顶元素
 
void Push(SqStack&s,ElemType elem);//压入元素
 
void Pop(SqStack &s);//弹出元素
 
void ReverseStack(SqStack&s);//反转栈
 
void SortStack(SqStack&s);//栈元素排序
 
void ClearStack(SqStack&s);//清空栈
 
void Interaction();//输出操作
 
int main()
{
   Interaction();
 
   SqStack s;
   int operate;
   while(cin>>operate)
    {
       switch(operate)
       {
       case 0:
           return 0;
 
       case 1:
           if(InitStack(s))
           {
                ReverseCreatStack(s);
           }
           break;
 
       case 2:
           if(IsEmpty(s))
           {
                cout<<"栈为空。\n";
           }
           else
           {
                cout<<"栈不为空。\n";
           }
           break;
 
       case 3:
           cout<<"栈中的元素个数是:"<<StackLength(s)<<endl;
           break;
 
       case 4:
           Output(s);
           break;
 
       case 5:
           GetTop(s);
           break;
 
       case 6:
           ElemType elem;
           cout<<"请输入要压入的元素:";
           cin >>elem;
           Push(s,elem);
           cout<<"压入元素后的栈为:";
           Output(s);
           break;
 
       case 7:
           Pop(s);
           break;
 
       case 8:
           ReverseStack(s);
           cout<<"反转后的栈为:";
           Output(s);
           break;
 
       case 9:
           SortStack(s);
           break;
 
       case 10:
           ClearStack(s);
           break;
 
       default:
           cout<<"请输入正确的操作数字:";
       }
    }
 
    return 0;
}
 
Status InitStack(SqStack&s)//初始化栈:为栈分配初始空间
{
    s.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    if(!s.base)
    {
        cout<<"内存分配失败。\n";
        return FALSE;
    }
 
    s.top=s.base;//栈顶指针等于栈底指针:表示栈为空
    s.stackcapacity=STACK_INIT_SIZE;//容量
    s.stacklength=0;//元素个数
    return OK;
}
 
void ReverseCreatStack(SqStack&s)//逆序创建栈
{
    cout<<"请输入元素的个数:";
    int length;
    cin>>length;
    cout<<"请输入元素:";
    for(int i=0; i<length; i++)
    {
        ElemType elem;
        cin>>elem;
        Push(s,elem);//调用压入元素的函数
    }
    s.stacklength=length;
 
    cout<<"创建的栈为:";
    Output(s);
}
 
Status IsEmpty(SqStack s)//判断栈是否为空
{
    if(!s.base||s.base==s.top)//未初始化或者初始化但未填充元素
    {
        return OK;
    }
    return FALSE;
}
 
int StackLength(SqStack s)//求栈的元素个数
{
    return s.stacklength;
}
 
void Output(SqStack s)//输出栈的元素
{
    if(!IsEmpty(s))
    {
        ElemType * pointer=s.top-1;
        while(1)
        {
            cout<<*pointer<<"";
            if(pointer==s.base)//输出最后一个元素
            {
                break;
            }
            pointer--;
        }
 
        cout<<endl;
    }
    else
    {
        cout<<"栈为空,无法输出。\n";
    }
}
 
void GetTop(SqStack s)//得到栈顶元素
{
    if(IsEmpty(s))
    {
        cout<<"栈为空。\n";
        return;
    }
    cout<<"栈顶元素是:"<<*(s.top-1)<<endl;
}
 
void Push(SqStack&s,ElemType elem)//压入元素
{
    if(s.top-s.base>=s.stackcapacity)//容量不足,扩充容量
    {
        s.base=(ElemType*)realloc(s.base,(s.stackcapacity+STACKINCREMENT)*sizeof(ElemType));//更新栈底指针
        if(!s.base)
        {
            cout<<"内存分配失败。\n";
            return;
        }
 
        s.top=s.base+s.stackcapacity;//更新栈顶指针
        s.stackcapacity+=STACKINCREMENT;//更新栈的容量
    }
 
    *s.top=elem;//填入元素
    s.top++;//更新栈顶指针
    s.stacklength++;//更新元素个数
}
 
void Pop(SqStack &s)//弹出元素
{
    if(IsEmpty(s))
    {
        cout<<"栈为空,操作错误。\n";
        return;
    }
 
    s.top--;
    s.stacklength--;
    cout<<"删除元素后的栈为:";
    Output(s);
}
 
void ReverseStack(SqStack&s)//反转栈
{
    if(!IsEmpty(s))
    {
        ElemType * before=s.top-1,*after=s.base;
        while(before>after)
        {
            swap(*before,*after);
            before--;
            after++;
        }
        return;
    }
 
    cout<<"栈为空,无法反转。\n";
}
 
void SortStack(SqStack&s)//栈元素排序
{
    //冒泡法排序
    if(!IsEmpty(s))
    {
        ElemType * before=s.top-1,* after;
        while(before!=s.base)
        {
            after=before-1;
            while(1)
            {
                if(*before>*after)
                {
                    swap(*before,*after);
                }
 
                if(after==s.base)
                {
                    break;
                }
 
                after--;
            }
            before--;
        }
 
        cout<<"升序排序后的栈为:";
        Output(s);
        return;
    }
    cout<<"栈为空,无法排序。\n";
}
 
void ClearStack(SqStack&s)//清空栈
{
    s.top=s.base;
    s.stacklength=0;
    cout<<"栈清空成功。\n";
}
 
void Interaction()//输出操作
{
    cout<<"请输入对应操作的序号:\n";
    cout<<"0:退出程序 ;\n";
    cout<<"1:建立顺序栈 ;\n";
    cout<<"2:判断顺序栈是否为空 ;\n";
    cout<<"3:求顺序栈的元素个数;\n";
    cout<<"4:输出顺序栈 ;\n";
    cout<<"5:得到顺序栈的栈顶元素;\n";
    cout<<"6: 压入元素;\n";
    cout<<"7:弹出元素;\n";
    cout<<"8:反转当前顺序栈;\n";
    cout<<"9:将顺序栈升序排序 ;\n";
    cout<<"10:清空顺序栈  ;\n";
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值