(学习数据结构需要从其逻辑结构,运算,存储结构入手)
一.栈
1.逻辑结构(定义):只允许在一端进行插入或删除操作的线性表
2.运算(操作):创销,入栈,出栈,读栈顶,判空
3.存储结构:顺序存储->顺序栈,链式存储->链栈
二.代码实现
1.创建栈
#define MaxSize 10//栈中元素的最大个数
// -1是栈顶指针的初始化位置 [0,1,2,3,4,5,6,7,8,9]
typedef struct{
int data[MaxSize];//一个存放栈中数据元素的结构体
int top;//指向栈顶的指针
int size;
}SqStack;//定义栈的结构体
定义结构体
SqStack S;//声明一个顺序栈
InitStack(&S);//初始化
分配空间
void InitStack(SqStack *S){//初始化
S->top=-1;//栈顶指针指向初始化位置
S->size = 0;
}
2.入栈操作
bool Push(SqStack *S,int pushNum){//入栈
if(S->size>9){//栈满
return false;//入栈失败
}
S->data[++S->top]=pushNum;//入栈
//请注意是先将栈顶指针向后移位,后赋值
S->size++;//栈长+1
return true;
}
3.出栈操作
bool Pop(SqStack *S,int *popNum){//出栈操作
if(S->size==0){//栈中没有元素
return false;
}
*popNum = S->data[S->top--];//和读栈的区别在出栈将栈顶指针下移一位
S->size--;//计数-1
return true;
}
4.读取栈顶元素
bool ReadTop(SqStack *S,int *readNum){
if(S->size==0){//栈中没有元素
return false;
}
*readNum = S->data[S->top];
// printf("栈顶元素是%d\n",readNum);
return true;
}
三.代码整体
//顺序栈
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10//栈中元素的最大个数
// -1是栈顶指针的初始化位置 [0,1,2,3,4,5,6,7,8,9]
typedef struct{
int data[MaxSize];//一个存放栈中数据元素的结构体
int top;//指向栈顶的指针
int size;
}SqStack;//定义栈的结构体
void InitStack(SqStack *S){//初始化
S->top=-1;//栈顶指针指向初始化位置
S->size = 0;
}
bool Push(SqStack *S,int pushNum){//入栈
if(S->size>9){//栈满
return false;//入栈失败
}
S->data[++S->top]=pushNum;//入栈
S->size++;//栈长+1
return true;
}
bool ReadTop(SqStack *S,int *readNum){
if(S->size==0){//栈中没有元素
return false;
}
*readNum = S->data[S->top];
// printf("栈顶元素是%d\n",readNum);
return true;
}
bool Pop(SqStack *S,int *popNum){//出栈操作
if(S->size==0){//栈中没有元素
return false;
}
*popNum = S->data[S->top--];//和读栈的区别在出栈将栈顶指针下移一位
S->size--;//计数-1
return true;
}
int main(){
bool flag = true;
SqStack S;//声明一个顺序栈
InitStack(&S);//初始化
//入栈
int pushNum = 0;//记录入栈元素的变量
printf("请向栈中输入元素(输入99结束):");
scanf("%d",&pushNum);
while(pushNum != 99){
flag=Push(&S,pushNum);//入栈
if(flag){
printf("\n请向栈中输入元素(输入99结束):");
scanf("%d",&pushNum);
}else{
printf("入栈失败");
exit(0);
}
}
//读栈
int readNum = 0;
ReadTop(&S,&readNum);//读取栈顶元素
printf("栈顶元素是%d\n",readNum);
//出栈
int popNum = 0;//存储出栈元素的变量
char elect = NULL;//判断是否继续出栈的变量
printf("是否出栈元素(y|x):");
scanf("%s",&elect);
while(elect == 'y'){
flag = Pop(&S,&popNum); //调用出栈操作
if(flag == false){
printf("\n栈已空");
exit(0);
}else{
printf("\n出栈元素为%d",popNum);
}
printf("\n是否出栈元素(y|x):");
scanf("%s",&elect);
}
}