顺序栈的初始化、入栈、出栈、取栈顶元素、打印元素
//头文件的函数声明
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define SElemtype int
#define MaxSize 50
typedef struct
{
SElemtype* top; //栈顶指针
SElemtype* base; //栈底指针
int maxsize;
}SqStack;
bool InitStack(SqStack* SS); //初始化
void PushStack(SqStack* SS, SElemtype e); //入栈
void PopStack(SqStack* SS, SElemtype* e); //出栈
SElemtype GetSElen(SqStack SS); //取栈顶元素
void Print(SqStack SS); //打印
//函数的定义
#include"SqStack.h"
//初始化
bool InitStack(SqStack* SS)
{
SS->base = (SqStack*)malloc(sizeof(SqStack)* MaxSize); //动态分配空间
if (SS->base == NULL)
return false;
SS->maxsize = MaxSize; //定义数组容量
SS->top = SS->base; //栈顶指针和栈底指针指向相同的地址(用指针表示数组)
return true;
}
//入栈
void PushStack(SqStack* SS, SElemtype e)
{
//判满
if(SS->top-SS->base==SS->maxsize)
return;
*SS->top = e; //栈顶元素赋值
SS->top++; //栈顶指针往后一位走
}
//出栈
void PopStack(SqStack* SS,SElemtype*e)
{
//判空
if (SS->top == SS->base)
return;
*e = *(--SS->top); //栈顶元素减1;并用e保存栈顶元素
}
//取栈顶元素
SElemtype GetSElen(SqStack SS)
{
if (SS.top != SS.base)
return *(SS.top - 1);
}
//打印
void Print(SqStack SS)
{
for (int i = 0; i < SS.top - SS.base; i++)
{
printf("%d ", *(SS.base + i));
}
}
不太了解用指针表示数组的小伙伴可以试着写下面的代码,包含数组、指针,指针的解引用之间操作,通过对比和归纳就能懂了。
int main()
{
int a[6] = { 1,2,3,4,5,0 };
int* p = a; //指针p指向数组的第一个元素的地址a[0]
int* q = p + 5; //q指向数组的第6位a[5]的地址
*q = 8; //把a[5]的值改为8
printf("%d", *p); // p解引用获得的是改地址的值:1
printf("\n");
printf("%d", *(p+1)); //数组的第二位a[1]=2
printf("\n");
printf("%d", q - p); //指针相减表示两只指针之间相差的指针个数(6*int-1*int)/int=5
printf("\n");
printf("%d", a[5]); //8
return 0;
}
指针指向的是地址,数组也是一片地址,所以可以把指针看做数组。
int main()
{
int* m = malloc(sizeof(int)*5); //给指针m动态分配地址(等同于数组m[5])
* m = 1; //m指向的地址的第一个空间赋值1(m[0]=1)
* (m+1) = 2; //m指向的地址的第二个空间赋值2(m[1]=1)
* (m+2) = 3; //m指向的地址的第三个空间赋值2(m[2]=1)
* (m+3) = 4; //m指向的地址的第四个空间赋值2(m[3]=1)
* (m+4) = 5; //m指向的地址的第五个空间赋值2(m[4]=1)
for (int i = 0; i < 5; i++)
{
printf("%d", *(m + i));
}// m:12345
return 0;
}