顺序栈和链栈的基本操作

顺序栈

// 顺序栈
/*
栈空 top = -1
栈满 top = MAXSIZE - 1
进栈e操作:top++; 将e放到top中
退栈操作:从top中取出元素; top--;
*/

#include <iostream>
using namespace std;

#define MAXSIZE 100
typedef char ElemType;        /* ElemType类型根据实际情况而定,这里假设为char */


typedef struct
{
    ElemType data[MAXSIZE];
    int top;
}Sqstack;

/*初始化栈*/
void InitStack(Sqstack *&stack)
{
    stack = new Sqstack;
    stack->top = -1;        // -1表示空栈
}

/*销毁栈*/
void DestoryStack(Sqstack *&stack)
{
    delete stack;
}

/*判断栈是否为空, 为空是放回false*/
bool StackEmpty(Sqstack *stack)
{
    return stack->top + 1;  // top == -1是表示为空,top大于0就不为空
}

/*压栈(将元素e压到栈中)*/
bool Push(Sqstack *&stack, ElemType e)
{
    if(stack->top == MAXSIZE - 1) // 栈满了
        return false;

    stack->data[++stack->top] = e;
    return true;
}

/*出栈(从top中取出元素给e)*/
bool Pop(Sqstack *&stack, ElemType &e)
{
    if(stack->top == -1) // 栈已经为空
        return false;

    e = stack->data[stack->top--]; // top中取出元素

    return true;
}

/*取栈顶元素,返回当前的栈顶元素,并将其赋值给e*/
void GetTop(Sqstack *stack, ElemType &e)
{
    e = stack->data[stack->top];
}

/*判断一个字符串是否对称*/
bool Symmetry(ElemType str[])
{
    return true;
}

/*括号匹配*/
bool bracketsmatching(ElemType str[])
{
    return true;
}


int main()
{
    ElemType e;
    Sqstack *stack;
    InitStack(stack);
    if(StackEmpty(stack))
        printf("栈为空");
    else
        printf("栈为空");
    
    Push(stack, 'a');
    Push(stack, 'b');
    Push(stack, 'c');

    GetTop(stack, e);
    cout << e << endl;

    Pop(stack, e);
    cout << e << endl;
    Pop(stack, e);
    cout << e << endl;
    Pop(stack, e);
    cout << e << endl;


        
    return 0;
}

链栈

#include <iostream>
using namespace std;

#define MAXSIZE 100
typedef char ElemType;        /* ElemType类型根据实际情况而定,这里假设为char */

typedef struct Node
{
    ElemType date;
    struct Node *next;
}Linkstack, Node;

/*初始化栈*/
void InitStack(Linkstack *&stack)
{
    stack = new Linkstack;
}

/*清空栈, 一般不用清空栈这个操作,这个函数只是为后面销毁栈方便点*/
void ClearStack(Linkstack*& stack)
{
    Linkstack* p = stack;
    Linkstack* temp;

    while (p = p->next)
    {
        temp = p;
        p = p->next;
        delete temp;
    }
}

/*销毁栈*/
void DestoryStack(Linkstack *&stack)
{
    ClearStack(stack); // 先清除栈中的所有元素
    delete stack; // 销毁头结点
}

/*判断栈是否为空, 为空是放回true*/
bool StackEmpty(Linkstack *stack)
{
    return stack->next == NULL; // 头结点的next指针是否为空
}

/*压栈(将元素e压到栈中)*/
bool Push(Linkstack *&stack, ElemType e)
{
    // 头插法
    Node *temp = new Node;
    temp->date = e; // 把e放进来
    temp->next = stack->next;
    stack->next = temp;
    return true;
}

/*出栈(从top中取出元素给e)*/
bool Pop(Linkstack *&stack, ElemType &e)
{
    Node *temp; // 用来销毁top结点

    if(stack->next == NULL)// 栈已经为空
        return false;

    e = stack->next->date; // top中取出元素

    temp = stack->next;
    stack->next = stack->next->next;

    delete temp;

    return true;
}

/*取栈顶元素,返回当前的栈顶元素,并将其赋值给e*/
bool GetTop(Linkstack *stack, ElemType &e)
{
    if(stack->next == NULL)
        return false;

    e = stack->next->date;
    return true;
}

int main()
{ 
    ElemType e;
    Linkstack *stack;
    InitStack(stack);
    if(StackEmpty(stack))
        cout << "栈为空" << endl;
    else
        cout << "栈不为空" << endl;
    
    Push(stack, 'a');
    Push(stack, 'b');
    Push(stack, 'c');

    GetTop(stack, e);
    cout << "栈顶元素是:" << e << endl;

    Pop(stack, e);
    cout << e << endl;
    Pop(stack, e);
    cout << e << endl;
    Pop(stack, e);
    cout << e << endl;

    DestoryStack(stack);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值