栈:具有一定操作约束的线性表
1、针对于元素:后进先出
2、针对于操作:只在栈的一端(栈顶top)进行插入、删除
栈的抽象数据类型 描述
数据对象集:
- 具有0个或者多个元素的有穷线性表。
操作集:
- 长度为MaxSize的栈s∈stack。_
- 栈元素item∈ElemType
- 创建空栈:
- 判断栈空:empty()
- 判断栈满:
- 元素入栈:push()
- 元素出栈:pop()
- 弹出栈顶元素:top()
- 返回栈中元素数:size()
#include <iostream>
#include <stack> //标准库中的 stack
using namespace std;
int main()
{
stack<int> sta;
for (size_t i = 0; i < 10; i++)
{
sta.push(i);
}
cout << "栈顶元素为:" << sta.top() << endl;
cout << "栈中元数数:" << sta.size() << endl;
cout << "##### 弹出栈顶元素 #####" << endl;
sta.pop();
cout << "弹出栈顶元素后的元素个数:" << sta.size() << endl;
cout << "##### 向栈顶添加元素 #####" << endl;
sta.push(100);
cout << "栈顶元素:" << sta.top() << endl;
cout << "加入元素后,栈中元素个数为:" << sta.size() << endl;
system("pause");
return 0;
}
- 栈是一种线性表:故而可顺序存储或者链式存储。
栈的顺序存储:底层数据结构为数组。
- 一个一维数组
- 一个记录栈顶位置的变量
以数组为底层数据结构时,通常以数组头作为栈底。
- 创建结点
//基于C语言
typedef struct SNode *stack
struct SNode
{
ElementType Data[MaxSize]; //底层数组
int top; //标记栈顶位置。
}
- 入栈
//基于C语言
//先判断栈中能否再放元素。
void push(stack PtrS,ElementType item)
{
if(PtrS->top == MaxSize-1)
{
print("栈已满。")
return ;
}else{
(Ptrs->top)++; //先 数组下标增加
PtrS->Data[PtrS->top] = item; //再 放入元素
//Ptr->Data[++(PtrS->top)] = item;
return ;
}
- 出栈
//基于C语言
// 先判断栈中有无元素?
ElementType pop(stack PtrS)
{
if(PtrS->top == -1)
{
printf("栈中无元素,栈为空。");
return 0;
}else{
return(PtrS->Data[(PtrS->top)--]); //先弹出栈顶元素再下标减 1
}
}
栈的链式存储:底层数据结构为单链表
- 一个数据域
- 一个指针域
以单链表为底层数据结构时,在链的表头进行操作。
- 创建结点
typedef SNode *stack;
struct SNode
{
ElementType val; //数据域
struct SNode *next; //指针域,直接后继结点的存储位置
}
- 建立空栈
stack createStack()
{
stack sta;
sta = (stack)malloc(sizeof(struct SNode));
sta->next = NULL;
return sta;
}
- 判断是否为空栈
int empty(stack sta)
{
return(sta->next == NULL);
}