数据结构——顺序栈 代码(C语言)

顺序栈的初始化、入栈、出栈、取栈顶元素、打印元素 

//头文件的函数声明
#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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值