一、栈的定义
栈可理解为一种受限制的单链表,单链表可在标的两端进行插入删除,栈只能在一端进行插入删除,插入操作成为入栈(push),删除操作成为出栈(pop)。允许插入删除的一端称为栈顶(Top),另一端称为栈底(Button)。
特点:
(1)只能在栈顶进行插入删除;
(2)先入栈的元素在栈底,后入栈的元素在栈顶;
(2)具有“先进后出”(Last In First Out)的原则。
图示:
二、链栈
栈的实现可以通过顺序存储和链式存储实现。栈的链式存储是通过指针来实现的。
栈的结构定义如下:
typedef struct Node
{
int val;//数据域
Node *pnext;//指针域
}Node;
typedef struct Stack
{
Node *pBase;//栈底指针
Node *pTop; //栈顶指针
}stackList;
三
、代码实现
LStack.h
#pragma once
typedef struct Node
{
int val;
Node *pnext;
}Node;
typedef struct Stack
{
Node *pBase;
Node *pTop;
}*stackList;
Node* Buynode(); //创建一个节点
bool Initisite(stackList &stack); //初始化
bool push(stackList &stack, int val); //入栈
bool pop(stackList &stack); //出栈
bool IsEmpty(stackList &stack); //判断栈空
int GetTop(stackList &stack); //取栈顶元素
void display(stackList &stack); //打印栈元素
LStack.cpp
#include<iostream>
#include"LStack.h"
using namespace std;
Node* Buynode()//创建一个节点
{
Node *s = (Node*)malloc(sizeof(Node));
if (NULL == s) return NULL;
s->pnext = NULL;
return s;
}
bool Initisite(stackList &stack) //初始化
{
stack = (stackList)malloc(sizeof(stackList));
if (NULL == stack) return false;
stack->pBase = stack->pTop = Buynode();
return true;
}
bool push(stackList &stack, int val) //入栈
{
Node *p = Buynode();
p->val = val;
p->pnext = stack->pTop;
stack->pTop = p;
return true;
}
bool pop(stackList &stack) //出栈
{
Node *p = NULL;
if (!IsEmpty(stack))
{
p = stack->pTop;
stack->pTop = p->pnext;
free(p);
p = NULL;
return true;
}
return false;
}
bool IsEmpty(stackList &stack) //判断栈空
{
return stack->pBase == stack->pTop;
}
int GetTop(stackList &stack) //取栈顶元素
{
return stack->pTop->val;
}
void display(stackList &stack) //打印栈元素
{
Node *p = stack->pTop;
if (!IsEmpty(stack))
{
while (stack->pBase != p)
{
cout << p->val << " ";
p = p->pnext;
}
}
cout << endl;
}
main.cpp
#include<iostream>
#include"LStack.h"
using namespace std;
int main()
{
stackList stack ;
Initisite(stack);
push(stack, 12);
push(stack, 23);
push(stack, 34);
push(stack, 45);
push(stack, 56);
puts("Get the top data:");
printf("%d \n", GetTop(stack));
puts("display stack:");
display(stack);
pop(stack);
puts("display after pop a top data:");
display(stack);
return 0;
}
运行结果: