C++版顺序栈

栈是一种先进后出、后进先出的线性序列。

实现了顺序栈的创建和初始化,并实现了栈的入栈、出栈、取栈顶、遍历操作。

1、定义顺序栈的结构体

    栈的结构体有两个成员变量,一个是栈顶指针,指向栈顶元素的上一个位置;一个是栈底指针,指向栈的底部。

struct Stack
{
    int* base;   //栈底指针
    int* top;    //栈顶指针
};

2、顺序栈初始化

    给顺序栈分配一段内存空间,内存空间的容量即为栈的容量,动态分配返回的空间基地址作为栈底指针;                 

    初始时,栈顶指针等于栈底指针。

const int max_size = 1000;
//初始化
bool InitStack(Stack& s)
{
    s.base = new int[max_size];  //在内存上给栈分配一段空间
    if (!s.base)
    {
        return false;
    }
    s.top = s.base;   //初始时栈顶指针和栈底指针相同
    return true;
}

3、入栈操作

    分两步进行:首先,将入栈元素放到栈顶指针指向的位置;然后,将栈顶指针上移一位。

    注意:在入栈之前要判断栈是否已满。

//入栈
void Push(Stack& s)  
{
    int elem;
    cout << "请输入入栈元素" << endl;
    cin >> elem;
    if (s.top - s.base == max_size)   //栈已满
    {
        cout << "栈已满" << endl;
    }
    *s.top = elem;     //压入元素
    s.top++;           //栈顶指针上移,此时栈顶指针空指
}

4、出栈操作 

    分两步进行:首先,将栈顶指针下移一位,使其指向真正的栈顶元素;然后,将栈顶元素取走。

//出栈
void Pop(Stack& s)
{
    int elem;
    if (s.top == s.base)
    {
        cout << "栈已空" << endl;
    }
    s.top--;          //栈顶指针下移,此时栈顶指针指向真正栈顶元素
    elem = *s.top;    //取出元素
    cout << "出栈元素为:" << elem << endl;
}

5、取栈顶元素

    不需要移动栈顶指针,只取走栈顶指针前一个位置的元素即可

//取栈顶
void GetTop(const Stack& s)
{
    if (s.top == s.base)
    {
        cout << "栈已空" << endl;
    }
    int elem = *(s.top - 1);    //真正的栈顶元素是top-1位置上的元素
    cout << "栈顶元素为:" << elem << endl;
}

6、遍历打印顺序栈

    定义一个指针变量,从栈底指针开始,遍历到栈顶指针的前一个位置,打印变量指向的元素。

//遍历打印
void Print(const Stack& s)
{
    for (auto i = s.base; i < s.top; i++)
    {
        cout << *i << " ";
    }
    cout << endl;
}

整体代码:

#include <iostream>
using namespace std;
#define max_size 100

struct Stack
{
    int* base;   //栈底指针
    int* top;    //栈顶指针
};

//初始化
bool InitStack(Stack& s)
{
    s.base = new int[max_size];  //在内存上给栈分配一段空间
    if (!s.base)
    {
        return false;
    }
    s.top = s.base;   //初始时栈顶指针和栈底指针相同
    return true;
}

//栈中的元素包括s.base到s.top-1位置上的所有元素
//入栈
void Push(Stack& s)  
{
    int elem;
    cout << "请输入入栈元素" << endl;
    cin >> elem;
    if (s.top - s.base == max_size)   //栈已满
    {
        cout << "栈已满" << endl;
    }
    *s.top = elem;     //压入元素
    s.top++;           //栈顶指针上移,此时栈顶指针空指
}

//出栈
void Pop(Stack& s)
{
    int elem;
    if (s.top == s.base)
    {
        cout << "栈已空" << endl;
    }
    s.top--;          //栈顶指针下移,此时栈顶指针指向真正栈顶元素
    elem = *s.top;    //取出元素
    cout << "出栈元素为:" << elem << endl;
}

//取栈顶
void GetTop(const Stack& s)
{
    if (s.top == s.base)
    {
        cout << "栈已空" << endl;
    }
    int elem = *(s.top - 1);    //真正的栈顶元素是top-1位置上的元素
    cout << "栈顶元素为:" << elem << endl;
}

//遍历打印
void Print(const Stack& s)
{
    for (auto i = s.base; i < s.top; i++)
    {
        cout << *i << " ";
    }
    cout << endl;
}

int main()
{
    int choose = 0;
    Stack s;
    if (!InitStack(s))
    {
        cout << "初始化失败" << endl;
    }
    cout << "1、入栈" << endl;
    cout << "2、出栈" << endl;
    cout << "3、取栈顶" << endl;
    cout << "4、遍历" << endl;
    cout << "9、退出" << endl;
    while (choose != 9)
    {
        cout << "请输入要做的操作" << endl;
        cin >> choose;
        switch (choose)
        {
        case 1:
            Push(s);
            break;
        case 2:
            Pop(s);
            break;
        case 3:
            GetTop(s);
            break;
        case 4:
            Print(s);
            break;
        delegate:
            break;
        }
    }


    return 0;
}

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可惜浅灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值