链栈的实现
- 什么是栈?
栈是限定尽在表尾进行插入和删除操作的线性表。类似于手枪的弹夹,先放进去的子弹总是后出来,所以栈是先入后出的,类似的应用还有浏览器的后退,点击后退就类似于出栈,将上一次浏览的网址再加载出来。 - 栈的存储结构
栈有顺序存储结构和链式存储结构两种,顺序栈就和顺序表一样,在内存里占用连续的地址空间,而链栈则通过后继指针来指向下一个结点,所以可以将单链表的头指针作为链栈的栈顶,用一个栈顶指针<top>来实现,插入元素则将指针上移,指向新插入的结点,出栈则将指针下移。
- 链栈的c语言实现
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int SElemType;
typedef struct StackNode //定义链栈的结点数据结构
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
/*
把栈顶放在单链表的头部
对栈链来说是不需要头结点的
空栈:top = NULL
*/
typedef struct LinkStack
{
LinkStackPtr top; //栈顶指针 top
int count;
}LinkStack;
//声明函数
void StackInit(LinkStack* linkstack);
int Push(LinkStack *Stack,SElemType e);
int StackEmpty(LinkStack *Stack);
int Pop(LinkStack *Stack,SElemType &e);
LinkStack* StackInit();
int PrintStack(LinkStack* Stack);
int main(int argc,char** argv)
{
LinkStack* Stack = StackInit();
int e;
Push(Stack,26);
Push(Stack,43);
Push(Stack,38);
Push(Stack,32);
Push(Stack,79);
Push(Stack,50);
Push(Stack,28);
Push(Stack,84);
Push(Stack,19);
Push(Stack,71);
cout << "栈里有 " << Stack->count << " 个元素" << endl;
cout << "栈是否为空:"<<StackEmpty(Stack)<<endl;
printf("当前栈里还有%d个元素\n",Stack->count);
PrintStack(Stack);
Pop(Stack,e);
cout << "出栈元素:" << e << endl;
printf("当前栈里还有%d个元素\n",Stack->count);
return 0;
}
//栈的初始化
LinkStack* StackInit()
{
LinkStack* Stack = new(LinkStack);
Stack->top = NULL;
Stack->count = 0;
return Stack;
}
//打印栈
int PrintStack(LinkStack* Stack)
{
int j=Stack->count;
LinkStackPtr cur = Stack->top;
if(StackEmpty(Stack))
{
printf("此栈为空!\n");
return 0;
}
for(int i=0;i<Stack->count;i++)
{
printf("第 %d 个元素值:%d\n",j,cur->data);
cur = cur->next;
j--;
}
cout << endl;
return 1;
}
//判断栈是否为空
int StackEmpty(LinkStack *Stack)
{
if(Stack->top == NULL)
return 1;
return 0;
}
//压栈
int Push(LinkStack *Stack,SElemType e)
{
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = Stack->top; //把当前的栈顶元素赋给新结点的next
Stack->top = s;
Stack->count++;
return 1;
}
//出栈
int Pop(LinkStack *Stack,SElemType &e)
{
LinkStackPtr p;
e = Stack->top->data;
p = Stack->top;
Stack->top = Stack->top->next;
free(p);
Stack->count--;
return 1;
}
运行结果如下: