一、堆栈及其顺序存储
定义:具有一定操作约束的线性表,只在一段做插入,删除,后入先出
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;
}
}