顺序栈,链式栈的操作(c语言实现)
程序员文章站
2022-06-05 14:59:41
...
顺序栈
定义:利用顺序储存结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。
栈顶的位置不存放元素
操作:
1.初始化栈
2.判断是否为空栈
3.向栈中压入元素
4.取栈顶元素
5.元素出栈
说明:取栈顶元素和元素出栈的本质是不同的,后面有代码说明
图片转自https://blog.csdn.net/qq_25775935/article/details/88558779
未存放元素时,top指向a[0]的位置,如果放入了一个元素,则top指向a[1]的位置
链式栈
定义:采用链式储存结构实现的栈,一般用单链表来表示。
栈的操作都是在栈顶进行的,所以要设置一个头结点,头结点中不存放数据
操作:
同上
图片转自:https://blog.csdn.net/qq_25775935/article/details/88558779
#pragma once
# include <stdio.h>
# include <stdlib.h>
# define MaxSize 10
//顺序栈
//---------------------------------------------------------
typedef struct stack
{
int data[MaxSize];
int top;
}Seqstack;
//初始化
int InitStack(Seqstack *S)
{
S->top = 0;
return 1;
}
//判断是否为空
int Stackempty(Seqstack *S)
{
if (S->top == 0)
return 1;
else
return 0;
}
//元素入栈,栈顶始终不能存放元素
void PushItemStack(Seqstack *S, int e)
{
if (S->top > MaxSize)
{
printf("栈已满,无法入栈!\n");
return;
}
else
{
S->data[S->top] = e;
S->top++;
}
}
//元素出栈
int PopStack(Seqstack* S,int *e)
{
if (Stackempty(S))
{
printf("栈已空,无法删除元素!\n");
return 0;
}
else
{
S->top--;
*e = S->data[S->top];
return 1;
}
}
//取栈顶元素
int GetStackTop(Seqstack *S, int *e)
{
if (Stackempty(S))
{
printf("栈已空,无法取栈顶元素!\n");
return 0;
}
else
{
//注意:取栈顶元素并不是要让栈顶下移
//只要
*e = S->data[S->top - 1];
return 1;
}
}
//--------------------------------------------------------
//链式栈
typedef struct NODE
{
struct NODE*next;
int data;
}SNODE;
void StackInit(SNODE *head)
{
head = (SNODE*)malloc(sizeof(NODE));
head->next = NULL;
}
int Stackempty(SNODE *head)
{
if (head->next == NULL)
{
printf("栈已空!\n");
return 1;
}
else
return 0;
}
//元素入栈
void StackPush(SNODE *head, int e)
{
SNODE *t = (SNODE*)malloc(sizeof(NODE));
t->data = e;
t->next = head->next;
head->next = t;
}
//抛出栈顶
int StackTop(SNODE *head, int *e)
{
SNODE *t = (SNODE*)malloc(sizeof(NODE));
t = head->next;
*e = t->data;
return 1;
}
//出栈
int StackPop(SNODE *head, int *e)
{
if (Stackempty(head))
{
printf("栈已空,元素无法出栈!\n");
return 0;
}
else
{
*e = head->data;
return 1;
}
}
主函数:
# include <stdio.h>
# include <stdlib.h>
# include "stack.h"
int main()
{
Seqstack S;
InitStack(&S);
int a[10];
printf("请输入数据!\n");
for (int i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
PushItemStack(&S, a[i]);
}
printf("栈的长度为:%d\n", S.top);
printf("抛出栈顶元素!\n");
int e;
GetStackTop(&S, &e);
printf("栈顶元素为:%d",e);
printf("\n");
printf("元素出栈!\n");
int d;
for (int j = 0; j < 10; j++)
{
PopStack(&S, &d);
printf("%3d", d);
}
printf("------------------------------------------\n");
printf("将用链式栈!\n");
printf("请输入数据!\n");
SNODE *L;
L = (SNODE*)malloc(sizeof(NODE));
StackInit(L);
int b[10];
for (int i = 0; i < 10; i++)
{
scanf("%d", &b[i]);
StackPush(L, b[i]);
}
printf("抛出栈顶元素!\n");
int m;
StackTop(L, &m);
printf("栈顶元素为:%d\n", m);
printf("元素出栈!\n");
L = L->next;
for (int i = 0; i < 10; i++)
{
StackPop(L, &m);
L = L->next; //指针往后指
printf("%3d", m);
}
system("pause");
return 0;
}
代码运行截图
上一篇: 和老公离婚了能挽回老公的话语有哪些?
下一篇: 链式存储结构