
链栈的基本操作(超详细)
·
目录
前言
本文参考王卓老师的数据结构视频和严蔚敏老师的《数据结构》
一.链栈的定义
栈:操作受限的线性表,限定仅在表尾进行插入和删除操作的线性表,即后进先出。这一端被称为栈顶,相对地,把另一端称为栈底。
链栈:用链式结构存储的栈(我实际用的是不带头结点的单链表)
例子:类似子弹压入弹夹,后放入的子弹可以先从弹夹弹出来。
二、链栈的c++语言结构描述表示
代码如下(示例):
注意:我使用的是不带头节点的单链表
typedef struct LinkNode{
int data;//数据域
struct LinkNode *next;//指针域
}stackNode,*LinkStack;
三、链栈中基本操作的实现
3.1链栈的初始化
无需new,因为我是不带头结点的单链表
void initStack(LinkStack &s)
{
s=NULL;//不需要头节点
}
3.2判断链栈是否为空
当s==NULL时,栈为空,则返回1;否则,返回0
int stackEmpty(LinkStack s)
{
if(s==NULL)
return 1;
return 0;
}
3.3求链栈的长度
长度表示有多少个节点
int stackLength(LinkStack s)
{
int sum=0;
stackNode *temp=s;
while(temp!=NULL)
{
sum++;
temp=temp->next;
}
return sum;
}
3.4 链栈的入栈
p是新节点
关键处在于当栈为空的时候,p就是第一个节点;而当栈不为空时,则让p的next指针指向s,而s更新到p节点,相当于还是让p作为第一个节点
void push(LinkStack &s,int e)
{
stackNode *p=new stackNode;
p->data=e;
p->next=NULL;
if(s==NULL)
s=p;
else
{
p->next=s;
s=p;
}
}
3.4 链栈的出栈
当栈为空的时候,是无法弹出的
new一个p节点
而当栈不空时,则让p指向s的第一个节点,更新s,使s指向下一个节点,在删掉p
void pop(LinkStack &s,int &e)
{
stackNode *p=new stackNode;
if(s==NULL)
{
cout<<"栈为空,无法弹出"<<endl;
}
else
{
p=s;
e=p->data;
s=s->next;
delete p;
cout<<"成功弹出栈顶元素"<<endl;
}
}
3.5求栈顶元素
当栈不空时,返回第一个节点的数据
int top(LinkStack s)
{
if(s==NULL)
return -1;
return s->data;
}
3.6销毁栈
void DestoryStack(LinkStack &S)
{
stackNode *p;
while(S)
{
p=S;
S=S->next;
delete p;
}
S=NULL;
cout<<"成功销毁"<<endl;
}
四.链栈的具体实现
#include <iostream>
using namespace std;
//不带头节点的
typedef struct LinkNode{
int data;//数据域
struct LinkNode *next;//指针域
}stackNode,*LinkStack;
void initStack(LinkStack &s)
{
s=NULL;//不需要头节点
}
int stackEmpty(LinkStack s)
{
if(s==NULL)
return 1;
return 0;
}
int stackLength(LinkStack s)
{
int sum=0;
stackNode *temp=s;
while(temp!=NULL)
{
sum++;
temp=temp->next;
}
return sum;
}
void push(LinkStack &s,int e)
{
stackNode *p=new stackNode;
p->data=e;
p->next=NULL;
if(s==NULL)
s=p;
else
{
p->next=s;
s=p;
}
}
void pop(LinkStack &s,int &e)
{
stackNode *p=new stackNode;
if(s==NULL)
{
cout<<"栈为空,无法弹出"<<endl;
}
else
{
p=s;
e=p->data;
s=s->next;
delete p;
cout<<"成功弹出栈顶元素"<<endl;
}
}
int top(LinkStack s)
{
if(s==NULL)
return -1;
return s->data;
}
//销毁栈
//所有节点
void DestoryStack(LinkStack &S)
{
stackNode *p;
while(S)
{
p=S;
S=S->next;
delete p;
}
S=NULL;
cout<<"成功销毁"<<endl;
}
void menu()
{
cout<<"**************************"<<endl;
cout<<"1.初始化"<<endl;
cout<<"2.判断栈是否为空"<<endl;
cout<<"3.求栈的长度"<<endl;
cout<<"4.销毁栈"<<endl;
cout<<"5.入栈"<<endl;
cout<<"6.出栈"<<endl;
cout<<"7.求栈顶元素"<<endl;
cout<<"8.退出"<<endl;
cout<<"**************************"<<endl;
}
int main()
{
int choice;
LinkStack s;
int e1,e2;
while(1)
{
menu();
cin>>choice;
switch(choice)
{
case 1:
initStack(s);
cout<<"初始化成功"<<endl;
break;
case 2:
if(stackEmpty(s))
cout<<"栈为空"<<endl;
else
cout<<"栈不为空"<<endl;
break;
case 3:
cout<<"栈的长度为"<<stackLength(s)<<endl;
break;
case 4:
DestoryStack(s);
break;
case 5:
cout<<"请输入想要入栈的元素值:"<<endl;
cin>>e1;
push(s,e1);
cout<<"入栈成功"<<endl;
break;
case 6:
pop(s,e2);
cout<<"弹出的元素为"<<e2<<endl;
break;
case 7:
if(top(s)!=-1)
cout<<"栈顶元素为"<<top(s)<<endl;
else
cout<<"栈为空"<<endl;
break;
case 8:
cout<<"成功退出"<<endl;
exit(0);
default:
cout<<"输入有误,请重新输入"<<endl;
break;
}
}
}
五.测试结果
图一
图二
图三
图四
图五
图六
图七
六、总结
栈是一种操作受限的线性表,虽然操作受限,但是与线性表有点类似,只不过栈的插入和删除都在表尾而已。我实现的链栈其实与不带头节点的链表有很大关系,各位也可以参考下链表来学习链栈。
阅读全文
AI总结
更多推荐
所有评论(3)
您需要登录才能发言
相关推荐
查看更多
A2A

谷歌开源首个标准智能体交互协议Agent2Agent Protocol(A2A)
adk-python

一款开源、代码优先的Python工具包,用于构建、评估和部署灵活可控的复杂 AI agents
Second-Me

开源 AI 身份系统,通过本地训练和部署,模仿用户思维和学习风格,创建专属AI替身,保护隐私安全。
那么,加 99,再减 100,当然就是 “-1” 了。
计算机,使用的是二进制数。
八位二进制数是:0000 0000 ~ 1111 1111。
相当于十进制数:0 ~ 255。
如果,进位 = 1,就是:2^8 = 256。
那么,加 255,再减 256,这也就是 “-1” 了。
所以:255 (1111 1111),就是:-1;
同理:254 (1111 1110),就是:-2;
253 (1111 1101),就是:-3;
。。。 。。。
128 (1000 0000),即:-128。
以上这些正数,就是计算机专家 “发明” 的补码了。
由此可知:
所谓的 “补码”,也是正常的数字。
它之所以能代替负数,关键是【舍弃了进位】。
而并非是来自“符号位原码反码”。
解释或说明“补码”,只需做一道小学算术题。
但是,老外却弄不懂这些。
所以才编造一套谎言:机器数符号位模符号位也参加运算 ...
你看过【卖拐】吗?
你要是跟着老外学算术,你立刻、马上、直接就掉沟里去了!
呵呵
任意的进制中,都有“补码”。
你看十进制,两位数,就是:0 ~ 99。
可以有:27 + 99 = (一百) 26
也可以:27 - 1 = 26
如果你忽略进位,依旧保持两位数,
这两种算法的功能,就是相同的!
就是说,当你舍弃了进位:
正数,就能当负数使用!
加法,也就可以实现减法运算!
如果在计算机中舍弃进位:
减法器,就可以省掉了。
只用一个加法器,就可横行天下!
也可以说,计算机中,根本就没有:原码反码补码。
你费这么多语言来解释补码,只能说:你被忽悠瘸了。