本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、栈的定义
栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底。栈是一种后进先出的线性表。
二、顺序栈的定义
栈的顺序存储实质上就是线性表顺序存储的简化。因为栈底元素变化较小,因此我们将下标为0的一端作为栈底,用一个top变量来指示栈顶。空栈时,top=-1。
/*顺序栈的结构定义*/
typedef struct
{
ElementType data[MAXSIZE];
int top;
}SqStack;
三、顺序栈的相关操作实现
1.栈的初始化
/*创建一个空栈*/
void InitStack(SqStack *stack)
{
stack->top=-1;
}
2.置为空栈
/*将stack置为空栈*/
void ClearStack(SqStack *stack)
{
stack->top=-1;
}
3.返回栈的长度
/*返回栈的长度*/
int StackLength(SqStack stack)
{
return stack.top+1;
}
4.返回栈顶元素
/*返回栈顶元素,并判断栈是否为空*/
int GetTop(SqStack stack,ElementType *e)
{
if(stack.top==-1)
return 0;
else
*e=stack.data[stack.top];
return 1;
}
5.压栈和弹栈的实现
/*压栈元素e*/
int Push(SqStack *stack,ElementType e)
{
if(stack->top == MAXSIZE -1)
{
return 0;
}
stack->top++;
stack->data[stack->top]=e;
return 1;
}
/*弹栈栈顶元素*/
int Pop(SqStack *stack,ElementType *e)
{
if(stack->top==-1)
return 0;
*e=stack->data[stack->top];
stack->top--;
return 1;
}
6.遍历输出栈中元素
/*从栈底到栈顶依次遍历输出每个数据元素*/
void StackTraverse(SqStack stack)
{
int i=0;
while(i<=stack.top)
{
printf("%d ",stack.data[i]);
i++;
}
printf("\n");
}
四、具体代码实现
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int ElementType;
/*顺序栈的结构定义*/
typedef struct
{
ElementType data[MAXSIZE];
int top;
}SqStack;
/*创建一个空栈*/
void InitStack(SqStack *stack)
{
stack->top=-1;
}
/*将stack置为空栈*/
void ClearStack(SqStack *stack)
{
stack->top=-1;
}
/*返回栈的长度*/
int StackLength(SqStack stack)
{
return stack.top+1;
}
/*返回栈顶元素,并判断栈是否为空*/
int GetTop(SqStack stack,ElementType *e)
{
if(stack.top==-1)
return 0;
else
*e=stack.data[stack.top];
return 1;
}
/*压栈元素e*/
int Push(SqStack *stack,ElementType e)
{
if(stack->top == MAXSIZE -1)
{
return 0;
}
stack->top++;
stack->data[stack->top]=e;
return 1;
}
/*弹栈栈顶元素*/
int Pop(SqStack *stack,ElementType *e)
{
if(stack->top==-1)
return 0;
*e=stack->data[stack->top];
stack->top--;
return 1;
}
/*从栈底到栈顶依次遍历输出每个数据元素*/
void StackTraverse(SqStack stack)
{
int i=0;
while(i<=stack.top)
{
printf("%d ",stack.data[i]);
i++;
}
printf("\n");
}
void StackTest()
{
SqStack stack;
int i;
ElementType e;
InitStack(&stack);
for(i=0;i<7;i++)
{
Push(&stack,i);
}
printf("The elements in the stack are:\n");
StackTraverse(stack);
Pop(&stack,&e);
printf("The pop-up stack top element is:%d\n",e);
GetTop(stack,&e);
printf("The top element of the stack is :%d The length of the stack is %d\n",e,StackLength(stack));
ClearStack(&stack);
printf("After emptying the stack, the length of the stack:%d",StackLength(stack));
}
int main()
{
StackTest();
return 0;
}
五、样例输出
The elements in the stack are: 0 1 2 3 4 5 6
The pop-up stack top element is:6
The top element of the stack is :5 The length of the stack is 6
After emptying the stack, the length of the stack:0
六、写在最后
这里是数据结构个人学习的笔记记录,如有问题欢迎指正说明。