不带头结点
#include <iostream>
using namespace std;
typedef struct LNode
{
int data; //每个节点存放一个数据元素
struct LNode* next; //指针指向下一个节点
}LNode, * LinkStack;
//初始化栈
bool InitStack(LinkStack& L)
{
L = NULL;
return true;
}
//判断栈空
bool StackEmpty(LinkStack L)
{
return L == NULL;
}
//新元素入栈
bool Push(LinkStack& L, int x)
{
LNode* s = new LNode; //分配结点
if (s == NULL)
return false;
s->data = x; //保存新元素
s->next = L; //指向 L 所指的地址
L = s; //L指向 s 结点
return 0;
}
//指定结点的删除
bool DeleteNode(LNode* p)
{
if (p == NULL || p->next == NULL)
return false;
LNode* q = p->next; //令 q 指向 *p 的后继结点
p->data = p->next->data;//和后继结点交换数据域
p->next = q->next; //将 *q 结点从链中“断开”
free(q); //释放后继结点的存储空间
return true;
}
//出栈操作
bool Pop(LinkStack& L, int& x)
{
if (StackEmpty(L)) //判空操作
return false;
x = L->data; //返回要出栈的元素
DeleteNode(L); //删除操作
return true;
}
//读栈顶元素
bool GetTop(LinkStack L, int& x)
{
if (StackEmpty(L))
return false;
x = L->data; //返回栈顶元素
return true;
}
int main()
{
LinkStack L; //声明一个链栈(分配空间)
InitStack(L);
//测试
for (int i = 0; i < 10; i++)
{
Push(L, i);
cout << L->data << endl;
}
cout << endl;
LNode* p = L;
int x;
Pop(L, x);
while (p != NULL)
{
cout << p->data << endl;
p = p->next;
}
int i;
GetTop(L, i);
cout << "栈顶元素:";
cout << i << endl;
cout << "栈是否为空:" << StackEmpty(L) << endl;
return 0;
}
带头结点
#include <iostream>
using namespace std;
typedef struct LNode {
int data; //每个节点存放一个数据元素
struct LNode* next; //指针指向下一个节点
}LNode, * LinkStack;
//初始化栈
bool InitStack(LinkStack& L)
{
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = NULL;
return true;
}
//判断栈空
bool StackEmpty(LinkStack L)
{
return L->next == NULL;
}
//新元素入栈
bool Push(LinkStack& L, int x)
{
LNode* s = new LNode;
if (s == NULL)
return false;
s->data = x; //用结点 s 保存数据元素 x
s->next = L->next;
L->next = s; //将结点 s 连接到 L 之后
return 0;
}
//指定结点的删除
bool DeleteNode(LNode* p)
{
if (p == NULL)
return false;
LNode* q = p->next; //令q指向*p的后继结点
p->data = p->next->data;//和后继结点交换数据域
p->next = q->next; //将*q结点从链中“断开”
free(q); //释放后继结点的存储空间
return true;
}
//出栈操作
bool Pop(LinkStack& L, int& x)
{
if (StackEmpty(L))
return false;
if (L == NULL)
return false;
x = L->next->data;
DeleteNode(L);
return true;
}
//读栈顶元素
bool GetTop(LinkStack L, int& x)
{
if (L->next == NULL) //空栈
return false;
x = L->next->data; //返回第一个元素(栈顶元素)
return true;
}
int main()
{
LinkStack L; //声明一个链栈(分配空间)
InitStack(L);
for (int i = 1; i <= 10; i++)
{
Push(L, i);
cout << L->next->data << endl;
}
int top = -1;
GetTop(L, top);
cout << "栈顶元素:" << top << endl;
int x = -1;
Pop(L, x);
cout << "删除的元素:" << x << endl;
LNode* p = L;
while (p->next != NULL)
{
p = p->next;
cout << p->data << endl;
}
GetTop(L, top);
cout << "栈顶元素:" << top << endl;
cout << "栈是否为空:" << StackEmpty(L) << endl;
return 0;
}
若有错误请指正