-
第一种: 顺序栈
- 可采取这位大佬的顺序栈(静态数组):
https://blog.csdn.net/potential1/article/details/72578086
(ta采用的顺序栈是一个存放数据的数组和一个栈顶指针top(初始值为-1) )很简洁易懂。
2. 也可采用这两位大佬的顺序栈(动态数组):
https://blog.csdn.net/m_hahahaha1994/article/details/51745420 (只有基本操作) https://blog.csdn.net/perry0528/article/details/82025829 (含具体main函数)
3.【!注意!】(小本本记好,划重点了)
如果top是指向栈顶元素的下一个位置---->
栈空:top=base
栈满:s.top-s.base>=stacksize
入栈:先放数据 (*s.top=e),再移动指针(s.top++)
出栈:先移动指针(s.top--),再保存数据(e=s.top)
获取栈顶:e=*(s.top--);(先将top向下移动再获取数值)
如果top是指向的就是栈顶元素的位置---->
栈空:top=base
栈满:s.top-s.base>=stacksize-1
入栈:先移动指针(s.top++)腾出空位,再放数据 (*s.top=e)
出栈:先保存数据(e=s.top),再移动指针(s.top--)
获取栈顶:e=*s.top(也是先获取数值)
-
第二种: 链栈
(有以下几个素材图,看那个有助于理解就看哪个。)
看代码:(依旧含有魅力解说@v@)
//声明:规定在头节点后进行插入删除出栈入栈
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int SElemType;
//定义链栈
typedef struct SNode
{
SElemType data;
struct SNode *next;
}SNode, *LinkStack;
//创建链栈
Status CreatStack(LinkStack &S,int n)
{
LinkStack p;
int i;
S = (LinkStack)malloc(sizeof(SNode));
S->next = NULL;
for(i = n;i > 0;i--)
{
p=(LinkStack)malloc(sizeof(SNode));
scanf("%d",&p->data);
//输入值后就放在头节点之后,保证头结点就是栈顶
p->next = S->next;
S->next = p;
}
return 1;
}
//入栈
Status Push(LinkStack &S,SElemType e)
{
LinkStack p;
p = (LinkStack)malloc(sizeof(SNode));
p->data = e;
//先后连在接前
p->next = S->next;
S->next = p;
return 1;
}
//出栈
Status Pop(LinkStack &S,SElemType &e)
{
LinkStack p = S->next;
e = p->data;//先用p保存要删除的头结点,用e返回其数据值
S->next = S->next->next;
return 1;
}
//获取栈顶元素
Status GetTop(LinkStack S,SElemType &e)
{
if(S->next == NULL)
return 0;
e = S->next->data;
return e;
}
//求栈长
Status StackLength(LinkStack S)
{
LinkStack p = S->next;//从第一个节点开始
int i = 0;
while(p!=NULL){
i++;
p=p->next;
}
return i;//直到最后一个节点为止
}
//判空
Status StackEmpty(LinkStack &S)
{
if(S->next == NULL)
return 1;
else
return 0;
}
//清空栈
Status ClearStack(LinkStack &S)
{
S->next = NULL;//清空栈就是把头结点的指针指向空,相当于断链
return 1;
}
//销毁栈
Status DeatroyStack(LinkStack &S)
{
LinkStack p = S,q;
while(p != NULL)
{
q = p->next;
free(p);
p = q;//这条语句不能忘记哦~ ,保证pq往下依次进行
}
return 1;
}
//输出栈中元素
void Print(LinkStack S)
{
LinkStack p = S->next;
while(p != NULL)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkStack LS;
int n,top,elemtop;
printf("请输入总节点数\n");
scanf("%d",&n);
CreatStack(LS,n);
Print(LS);
Push(LS,100);printf("\n");
printf("将100入栈后 栈更新为:\n");
Print(LS);
printf("\n");
Pop(LS,top);
printf("弹出当前栈顶数据为:%d\n",top);
printf("此时栈更新为:\n");
Print(LS);
GetTop(LS,elemtop);
printf("当前栈顶元素为%d\n",elemtop);
printf("\n");
printf("此时栈内共有%d个元素\n",StackLength(LS));
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/f6984feeb2a8e6c965c5d85fbcebb5e1.png)
-
本星星还没致谢你就走,有点仪式感没?说你呢!往下看 。◕‿◕。
(俺还没致谢呢,看了这么久,辛苦了傻孩子)
-
正经致谢: