基于数据结构(严蔚敏版)
目录
前言
栈(Stack)是一种特殊的线性表,它所有的插入和删除都限制在表的同一端进行。
---------------------------------------------------------------------------------------------------------------------------------单链表的相关知识点:单链表的创建,插入,删除以及查找_Lookdrama的博客-优快云博客链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列结点组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。https://blog.youkuaiyun.com/Lookdrama/article/details/127466859?spm=1001.2014.3001.5501---------------------------------------------------------------------------------------------------------------------------------
一、栈是什么?
1.栈的定义:
栈(Stack)是一种特殊的线性表,它所有的插入和删除都限制在表的同一端进行。
栈中允许进行插入、删除操作的一端叫做栈顶(Top),另一端则叫做栈底(Bottom)。当栈中没有元素时,称之为空栈。栈的插入运算通常称为压栈、进栈或入栈(Push),栈的删除运算通常称为弹栈或出栈(Pop)。示意图如下
基本操作:入栈、出栈、获取栈顶元素、销毁、判空
二、顺序栈的插入和删除
1.顺序栈的结构体
/*顺序栈结构*/
typedef struct SqStack
{
int data[MAXSIZE];
int top; /*用于栈顶指针*/
}SqStack;
2.顺序栈的初始化
//初始化一个顺序栈
void Init_Stack(SqStack *S)
{
S = (SqStack*)malloc(sizeof(SqStack));
S->top = -1; //可判断栈是否为空
}
3.顺序栈的创建
//顺序栈的创建
void createStack(SqStack *S)
{
int num1;
int e;
printf("请输入所需要进栈的个数\n");
scanf("%d",&num1);
printf("请输入栈中元素\n");
while(num1!=0)
{
scanf("%d",&e);
S->top++;
S->data[S->top]=e;
num1--;
}
}
4.顺序栈的插入
/*插入元素e为新的栈顶元素*/
void Push(SqStack *S,int e)
{
if(S->top==MAXSIZE-1) //栈满
{
printf("栈已满,无法进行进栈操作\n");
}
S->top++; //栈顶指针增加一
S->data[S->top]=e; //将新插入的元素赋值给栈顶元素
}
5.顺序栈的删除
/*若栈不空,则删除S的栈顶元素,并用e来表示删除的元素的值*/
void pop(SqStack *S)
{
if(S->top==-1)
{
printf("栈为空,无法进行出栈操作\n");
}
S->top--;
}
6.顺序栈的打印
/*打印栈*/
void printStack(SqStack *S)
{
if(S->top==-1)
{
printf("栈为空,无法打印\n");
}
else
{
printf("该栈的内容为:");
for(int i=1;i<=S->top;i++)
{
printf("%d ",S->data[i]);
}
}
printf("\n");
}
7.主函数
int main()
{
SqStack S[MAXSIZE];
Init_Stack(S);
printf("顺序栈创建成功\n");
createStack(S);
printStack(S);
Push(S,3);
printStack(S);
pop(S);
printStack(S);
return 0;
}
8.完整代码
#include<stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
/*顺序栈结构*/
typedef struct SqStack
{
int data[MAXSIZE];
int top; /*用于栈顶指针*/
}SqStack;
//初始化一个顺序栈
void Init_Stack(SqStack *S)
{
S = (SqStack*)malloc(sizeof(SqStack));
S->top = -1;
}
/*插入元素e为新的栈顶元素*/
void Push(SqStack *S,int e)
{
if(S->top==MAXSIZE-1) //栈满
{
printf("栈已满,无法进行进栈操作\n");
}
S->top++; //栈顶指针增加一
S->data[S->top]=e; //将新插入的元素赋值给栈顶元素
}
/*若栈不空,则删除S的栈顶元素,并用e来表示删除的元素的值*/
void pop(SqStack *S)
{
if(S->top==-1)
{
printf("栈为空,无法进行出栈操作\n");
}
S->top--;
}
/*打印栈*/
void printStack(SqStack *S)
{
if(S->top==-1)
{
printf("栈为空,无法打印\n");
}
else
{
printf("该栈的内容为:");
for(int i=1;i<=S->top;i++)
{
printf("%d ",S->data[i]);
}
}
printf("\n");
}
//顺序栈的创建
void createStack(SqStack *S)
{
int num1;
int e;
printf("请输入所需要进栈的个数\n");
scanf("%d",&num1);
printf("请输入栈中元素\n");
while(num1!=0)
{
scanf("%d",&e);
S->top++;
S->data[S->top]=e;
num1--;
}
}
int main()
{
SqStack S[MAXSIZE];
Init_Stack(S);
printf("顺序栈创建成功\n");
createStack(S);
printStack(S);
Push(S,3);
printStack(S);
pop(S);
printStack(S);
return 0;
}
9.编译结果
总结
1.顺序栈的时间复杂度:O(1)
2.栈与线性表的区别与联系
(1)栈是特殊的线性表
(2)栈的插入与删除运算只能在栈顶进行,而线性表的插入和删除运算可在线性表中的任意位置进行