栈是操作受限的线性表,即栈只能在表尾进行插入删除的操作
所以和线性表一样根据存储方式的不同可以将栈分为顺序栈和链栈
顺序栈:(结构体的定义)
typedef int SElemType; //按照栈存储的元素的具体数据类型来定义数据类型
typedef struct {
SElemType* base; //栈底指针
SElemType* top; //栈顶指针
int stacksize; //栈可用最大空间
}SqStack;
栈中的元素个数=top - base
初始化:
Status ChuShihua(SqStack &s){
s.base = new SElemType[100];
//s.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));
if (!s.base) printf("分配失败");
s.top = s.base; //栈顶指针等于栈底指针
s.stacksize = 100; //设置栈的最大存储空间大小
return ok;
}
代码中的Status是根据自己需要自行定义的数据类型
s.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));为C语言方式的分配存储空间
代码中为C++的方式(释放空间时使用delete),C语言释放空间则使用free
判断栈是否为空:
Status IsEmpty(SqStack s) {
if (s.top == s.base)
return true;
else
return false;
}
清空栈:
Status Clear(SqStack s) {
if (s.base) s.top = s.base; //如果栈存在且栈底不为空则将栈清空
return 0;
}
销毁栈:
Status Destroy(SqStack& s) {
if (s.base) { //如果栈底元素不为空则依次释放栈底的存储空间,直到都为空为止
delete s.base;
s.stacksize = 0;
s.base = s.top = NULL;
}
return 0;
}
入栈:
Status Push(SqStack& s, SElemType e) {
if (s.top - s.base == s.stacksize) //栈满
return false;
*s.top++ = e; //将存入元素置于栈顶然后将栈顶指针向上移一位
return true;
}
出栈:
Status Pop(SqStack& s, SElemType& e) {
if (s.top == s.base)
return 0;
e = *--s.top;
return 1;
}
1、判断是否为空栈2、获取栈顶元素e、
3、栈顶指针减1
链栈:运算受限的单链表,只能在链表头部进行操作
链栈(结构体的创建):
typedef int SElemType;
typedef struct StackNode {
SElemType data;
struct StackNode* next;
}StackNode ,*LinkStack;
初始化:
void InitStack(LinkStack& s) {
s = NULL; //栈顶指针为空
}
判断栈是否为空:
Status StackEmpty(LinkStack s) {
if (s == NULL);
return true;
else
{
return false;
}
}
入栈:
Status Push(LinkStack& S, SElemType e) {
p = new StackNode; //生成新的结点
p->data = e;//将新结点数据域置为e
p->next = s;//将新结点插入栈顶
s = p; //修改栈顶指针
return true;
}
出栈:
Status Pop(LinkStack& s, SElemType& e) {
LinkStack p;
if (s == NULL)
return false;
e = s->data; //将栈顶元素的数据域的值赋值给e
p = s; //创建一个新的指针p使p指向要出栈的栈顶元素
s = s->next; //使栈顶元素的下一个元素成为栈顶元素
delete p; //释放p的存储空间即释放栈顶元素的存储空间
return true;
}
取栈顶元素:
SElemType GetTop(LinkStack s) {
if (s != NULL)
return s->data;
}