逻辑结构,存储结构,运算
栈的定义
栈是只能在一端进行插入,删除操作的线性表;
栈的操作特征为先进后出,栈的逻辑结果为线性结构,是一种特殊的线性表.
栈顶:允许插入,删除
栈底:不允许插入删除
存储结构--顺序存储
(1)定义
#include<stdio.h>
#define MaxSize 10
//顺序栈定义
typedef struct sqStack {
int data[MaxSize];
int top;
}sqStack;
(2)初始化
//初始化
void init(sqStack& s) {
s.top = -1;
}
(3)进栈
//进栈
bool push(sqStack &s,int e) {//e输入数据
//判断是否栈满
if (s.top==MaxSize-1)
{
return false;
}
s.data[++s.top] = e;
return true;
}
(4)出栈
//出栈
bool pop(sqStack& s, int &e) {
//判断是否空栈
if (s.top==-1)
{
return false;
}
e=s.data[s.top--];
return true;
}
(5)读取栈顶元素
//读取栈顶元素
bool getTop(sqStack &s,int &e) {
//判断是否空栈
if (s.top == -1)
{
return false;
}
e = s.data[s.top];
return true;
}
存储结构--链式存储
没有头结点,top指向栈顶元素,注意代码书写,之前都是带头.
(1)定义
#include<stdio.h>
#include <malloc.h>
typedef struct cStack
{
int data;//数据
cStack *next;//指针
}cStack ,*chain;
(2)初始化
此时栈内没有节点,c指向null;
bool init(chain &c) {
c= NULL;//不建议带头结点
return true;
}
(3)进栈
bool push(chain& c, int e) {
//创建一个节点
chain s = (chain)malloc(sizeof(cStack));
if (s==NULL)
{
return false;
}
s->next = c;
s->data = e;
c = s;
return true;
}
(4)出栈
bool pop(chain& c, int& e) {
if (c==NULL)//判断链栈是否为空
{
return false;
}
e=c->data;
c = c->next;
return true;
}
(5)读取栈顶元素
bool getTop(chain c,int &e) {
if (c==NULL)//判断是否为空链栈
{
return false;
}
e = c->data;
return true;
}