用C语言来写顺序栈

我是一个小小的小白,刚刚开始接触数据结构,根据老师留下的作业,敲了一个顺序栈的代码。
全部都是由个人去编辑的,如果有啥错误的话还希望各位大佬指出来。
同时我也是想留下这样一篇文章来提醒以后的自己顺序栈应该怎么写

1.首先是头文件和一些需要提前定义的定量

#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#define MAXSIZE 6
#define addtion 10

前面三行分别是C语言的头文件和C++的头文件
MAXSIZE 是定义了一个栈的最大的空间,addtion 是定义了如果空间不足的话每次要开辟的空间大小

2.定义栈

/*define the stack*/
typedef struct{
	int *top;
	int *base;
	int stacksize;
}sqstack;

定义了三个变量:头指针,尾指针和栈的大小;

3.创建一个新的栈

/*create new stack*/
s.base=(int*)malloc(sizeof(int)*MAXSIZE);
if(!s.base) printf("creste the new stack error!");
s.top=s.base;
s.stacksize=MAXSIZE;
printf("already create new stack");

在段代码中
第一行是为栈开辟空间,并把赋值给栈底指针
第二行是判断栈底指针的空间是否为空(注意不是值,是空间),如果空间为空,则报错
当开辟空间完成之后,令栈顶指针等于栈底指针,让整个栈为空栈
最后令栈的大小为MAXSIZE

4.压栈(给栈输入数据)

/*push the number in the stack*/
void push(sqstack &s,int e){
	if(s.top-s.base>=s.stacksize) printf("the stack is full");
	else *s.top++=e;
}

首先先判断栈是否满了,如果栈满,则报错
然后是把 e 这个值赋给当前的栈顶指针,然后使栈顶指针往上移,使栈顶指针始终保持着在栈的最上方

3.读取栈顶元素

/*get the top data*/
void get_topdata(sqstack &s,int e){
	if(s.top==s.base) printf("the stack is empty");
	e=*--s.top;
	printf("the top data is: %d\n",e);
}

首先判断栈是否为空,如果为空报错
如果栈不为空,则将栈顶指针往下移,并将栈顶指针所指向的值赋值给 e 并打印出来

4.出栈(也叫弹栈)

/*make the number out*/
void pop(sqstack &s,int e){
	if(s.top==s.base) printf("the stack is empty");
	e=*--s.top;
	printf("%d ",e);
}

首先判断栈是否为空,如果为空报错
如果栈不为空,则将栈顶指针往下移,并将栈顶指针所指向的值赋值给 e 并打印出来
这个函数需要用一些循环函数才能把所有的栈元素给弹出来

5.清栈

/*clean the stack*/
void clean_stack(sqstack &s){
	s.top=s.base;
}

令栈顶指针等于栈底指针,便可以清除里面的所有值

6.删除栈

/*destory the stack*/
void delete_stack(sqstack &s){
	free(s.base);
	s.top=s.base=NULL;
	s.stacksize=0;
}

将设置的空间全部释放

栈的基本功能就基本在上面了,还有主函数的代码,主函数只解释循环部分

int main()
{
    sqstack s;
    int e,i;
    printf("|    create the stack    |\n\n");
    initstack(s);
    printf("\n|    push the number    |\n");
    printf("\nplease enter the number:\n");
    scanf("%d",&e);
    while(e!=0)
    {
        push(s,e);
        scanf("%d",&e);
    }
    printf("already push the number in the stack\n\n");
    printf("|    get the top number    |\n");
    get_topdata(s,e);
    printf("\n|    pop the number    |\n");
    printf("\n the stack number is:\n");
    while(s.top!=s.base)    pop(s,e);
    printf("\n pop funtion run out\n");
    printf("\n\n");
    printf("|    the code already run out    |\n");
    return 0;
}

主函数里面的
第一个 while 循环表达的意思是:
先输入 e 的值,如果 e 不等于零,则进入循环,将 e 压入栈中,然后再输入 e 的值,这时候的 e 已经是下一个要被压入的值,假如输入的还是除了零以外的数,则继续进行循环体,直到输入0,退出循环

第二个 while 循环表达的意思是:
只要栈顶指针不等于栈底指针,则一直进行循环体

下面是运行结果的图片:
在这里插入图片描述
因为之前取栈顶元素的时候,把栈顶指针往下移了,所以在之后的操作中,就没有82这个值

本篇笔记就到这里啦,谢谢大家的观看,希望对你有用,同时代码有错的话记得联系我改过来噢!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值