数据结构 栈与队列(循环队列) 数组实现

栈与队列

栈是满足后进先出的一种数据结构,我这里是rear指针指向的栈顶不空的地方
想偷懒的同学可以用STL中的stack
在这里插入图片描述

#include <iostream>
#include <cstring>

using namespace std;

const int N = 10010;
int stk[N], rear;

void menu();
void init();
void destoryStack();
void clearStack();
bool stackEmpty();
int stackLength();
int getTop();
void push(int x);
int pop();
void traverse();

int main()
{
    menu();
    return 0;
}

void menu()
{
    int tag = 0;
    init();

    while (tag != 9)
    {
        cout << "\t\t\t\t\t请输入您需要的操作\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t1、销毁栈\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t2、清空栈\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t3、判断是否为空栈\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t4、获取栈的长度\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t5、获取栈顶元素\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t6、压栈\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t7、删除栈顶元素\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t8、遍历栈\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t9、exit\t\t\t\t\t" << endl;
        printf("请输入您要进行的操作:");
        scanf("%d", &tag);
        switch(tag)
        {
            case 1:
            {
                destoryStack();
                break;
            }
            case 2:
            {
                clearStack();
                break;
            }
            case 3:
            {
                if (stackEmpty() == true)
                    printf("Empty!\n");
                else
                    printf("Unempty!\n");
                break;
            }
            case 4:
            {
                printf("当前栈中元素的个数是%d\n", stackLength());
                break;
            }
            case 5:
            {
                printf("当前栈顶元素为%d\n", getTop());
                break;
            }
            case 6:
            {
                int x;
                printf("请输入待插入的元素:");
                scanf("%d", &x);
                push(x);
                break;
            }
            case 7:
            {
                printf("删除成功,删除的栈顶元素为%d\n", pop());
                break;
            }
            case 8:
            {
                traverse();
                break;
            }
        }
    }
}

void init()
{
    rear = -1;
}

void destoryStack()
{
    memset(stk, 0, sizeof stk);
    rear = -1;
}

void clearStack()
{
    memset(stk, 0, sizeof stk);
    rear = -1;
}

bool stackEmpty()
{
    return rear == -1 ? true : false;
}

int stackLength()
{
    return rear + 1;
}

int getTop()
{
    return stk[rear];
}

void push(int x)
{
    stk[++rear] = x;
}

int pop()
{
    int res = stk[rear];
    stk[rear--] = 0;
    return res;
}

void traverse()
{
    printf("自顶而下:");
    int cur = rear;
    while (cur != -1)
    {
        printf("%d ", stk[cur]);
        cur--;
    }
    puts("");
}

队列

队列是一中先进先出的数据结构,在这里我们用数组来模拟,使用循环队列的思想。当然队列也可以用结构类型数据来实现,这里就不多赘述,更简单的是用STL容器中的queue

#include <iostream>
#include <cstring>

using namespace std;

const int N = 6; //最多存储5个元素的循环队列
int que[N], front, rear;

void menu();
void init();
void destoryQueue();
void clearQueue();
bool queueEmpty();
int queueLength();
int getTop();
void push(int x);
int pop();
void traverse();

int main()
{
    menu();
    return 0;
}

void menu()
{
    int tag = 0;
    init();

    while (tag != 9)
    {
        cout << "\t\t\t\t\t请输入您需要的操作\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t1、销毁队列\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t2、清空队列\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t3、判断队列是否为空\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t4、获取队列的长度\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t5、获取队列队头元素\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t6、入队列\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t7、删除队头元素\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t8、遍历队列\t\t\t\t\t" << endl;
        cout << "\t\t\t\t\t9、exit\t\t\t\t\t" << endl;
        printf("请输入您要进行的操作:");
        scanf("%d", &tag);
        switch(tag)
        {
            case 1:
            {
                destoryQueue();
                break;
            }
            case 2:
            {
                clearQueue();
                break;
            }
            case 3:
            {
                if (queueEmpty() == true)
                    printf("Empty!\n");
                else
                    printf("Unempty!\n");
                break;
            }
            case 4:
            {
                printf("当前队列中元素的个数是%d\n", queueLength());
                break;
            }
            case 5:
            {
                printf("当前队头元素为%d\n", getTop());
                break;
            }
            case 6:
            {
                int x;
                printf("请输入待插入的元素:");
                scanf("%d", &x);
                push(x);
                break;
            }
            case 7:
            {
                printf("删除成功,删除的队头元素为%d\n", pop());
                break;
            }
            case 8:
            {
                traverse();
                break;
            }
        }
    }
}

void init()
{
    front = rear = 0;
}

void destoryQueue()
{
    memset(que, 0, sizeof que);
    front = rear = 0;
}

void clearQueue()
{
    memset(que, 0, sizeof que);
    front = rear = 0;
}

bool queueEmpty()
{
    return front == rear ? true : false;
}

int queueLength()
{
    return (rear - front + N) % N;
}

int getTop()
{
    return que[front];
}

void push(int x)
{
    que[rear] = x;
    rear = (rear + 1) % N;
}

int pop()
{
    int res = que[front];
    que[front] = 0;
    front = (front + 1) % N;
    return res;
}

void traverse()
{
    printf("当前队列:");
    int cur = front;
    while (cur != rear)
    {
        printf("%d ", que[cur]);
        cur = (cur + 1) % N;
    }
    puts("");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值