数据结构与算法——堆栈

一、堆栈及其顺序存储

定义:具有一定操作约束的线性表,只在一段做插入,删除,后入先出
ADT:
类型名称:堆栈(Stack)
数据对象集:一个有0个或多个元素的有穷链表
操作集:初始化空堆栈,判断是否已满,是否为空,插入和删除

堆栈的顺序存储结构通常由一个一维数组和记录栈顶元素位置的变量组成。
#define struct SNode* Stack;
struct SNode{
ElementType Data[MaxSize];
int Top;
};

代码实现:

#include<iostream>
using namespace std;
#define MaxSize 7
typedef struct SNode* Stack;
struct SNode
{
    int arr[MaxSize];
    int top;//记录最上层的位置,类似于线性表的last
};
Stack Ptrs;

//入栈
void Push(int x,Stack Ptrs)
{
    if(Ptrs->top==MaxSize-1) cout << "栈已满" <<endl;
    else
    {
        Ptrs->arr[++(Ptrs->top)] = x;
        return;
    }
}

//出栈

void Pop(Stack Ptrs)
{
    if(Ptrs->top==-1)
    {
        cout<<"栈已空"<<endl;
        return ERROR;
    }
    else{
        return (Ptrs->arr[(Ptrs->top)--]);
    }

}

二、堆栈的链式存储

堆栈的链式存储实际上是一个单链表,叫做链栈。插入和删除只能在链栈的栈顶进行。考虑到删除操作,栈的删除和插入应该在链表头进行。(含有头指针)

typedef struct SNode* Stack;
struct SNode{
ElementType Data;
Stack Next;
}

#include<iostream>
using namespace std;

typedef struct SNode* Stack;
struct SNode
{
    int data;
    Stack Next;
};

//创造栈的头结点,这里创造一个空栈

Stack CreateStack()
{
    Stack SHead;
    SHead = new struct SNode;
    SHead->Next = NULL;
    return SHead;
}
//空则返回1,否则返回0
int IsEmpty(SHead)
{
    if(SHead->Next==NULL)return 1;
    else return 0;
}
//考虑到不知道删除节点的上一个节点,删除插入放链头即栈顶,这里的头指针不需要移动,含有头结点
Stack Push(int x,Stack SHead)
{
    Stack p = new struct SNode;
    p->Next = SHead->Next;
    p->data = x;
    SHead->Next = p;
    return SHead;
}

int Pop(Stack SHead)
{
    if(SHead->Next==NULL) cout << "表已空" <<endl;
    else{
        Stack temp = SHead->Next;
        SHead->Next = temp->Next;
        int TopElement = temp->data;
        free(temp);
        return TopElement;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值