C语言顺序栈的实现以及进制转换

栈是 仅限定在表尾插入或输出的一种链表形式,它不能像链表一样随便输出、随便插入,是一种“先进后出”的形式,可以理解为逆序输出。

在这里插入图片描述
1.写顺序栈,我们需要先在头文件部分定义一个存储空间初始分配量和一个存储空间分配增量

#include<stdio.h>
#include<stdlib.h>
#define MAX 100//第一次分配内存空间时分配100
#define ADD 10//当我们输入的数据大于初始空间时就增加内存空间,每次增加10

2.然后是定义结构体变量,定义三个,栈顶指针、栈底指针、栈的大小

typedef struct stack{
	
	int stacksize;
	
	int *base;
	
	int *top;
	
}stack;

3.初始化栈,先给栈分配空间,然后使栈顶等于栈底

int InitStack(stack &s){
	
	s.base = (int*)malloc(MAX*sizeof(int));//这句的意思是给指针s.base分配int的大小乘以MAX字节的空间,并转化为int类型
	
	if(s.base == 0){
		
		printf("存储失败!");
		 
	}
	
	s.top = s.base;
	
	s.stacksize = MAX;
	
	return 0;
	 
}

4.判断是否为空栈,s.base=s.top

int StackEmpty(stack s){
	
	if(s.top == s.base){
		
		printf("栈为空!");
		
	}
		
		return 0;
	
}

5.求栈的长度

int StackLength(stack s){

	printf("\n");

	int count = 0;
	
	if(s.top == s.base){
		
		printf("栈为空!");
		
	}
	
	while(s.top != s.base){

		s.top--;

		count ++;

	}

	printf("栈的长度为:%d",count);

	return 0;
	
}

6.求栈顶元素

int GetTop(stack s,int &e){
	
	if(s.top == s.base){
		
		printf("栈为空!");
		
	}
	
	e = *(s.top-1);//s.top-1表示s.top的前一个指针,*(s.top-1)表示该指针指向的变量的值
	
	return 0;
	
} 

7.在栈顶插入元素

int PushStack(stack &s,int e){
	
	if(s.top - s.base >= MAX){
		
		s.base = (int*)realloc(s.base,(s.stacksize + ADD)*sizeof(int));//申请(s.stacksize+ADD)个int型空间,并且把s.base里的内容复制过去
		
		if(!s.base){
			
			printf("内存分配失败!");
			
		}
		
		s.top = s.base + MAX;
		
		s.stacksize = s.stacksize + ADD;
		
	}
	
	*s.top = e;//*s.top表示s.top指针指向的变量的值,让这个值等于e
	
	s.top++;//栈顶指针加一
	
	return 0;
	
}

7.删除栈顶元素

int PopStack(stack &s,int e){
	
	if(s.top == s.base){
		
		printf("栈为空!");
		
	}
	else{
		
		s.top--;
		
		e = *s.top;

	}

	printf("\n栈顶元素为:%d",e);
	
	return 0;
	
}

8.遍历栈

int PrintStack(stack s){
	
	if(s.base == s.top){
		
		printf("栈为空!");
		
	}
		
	int *p;//定义一个p指针
		
	p = s.top;//让它指向s.top
	
	printf("输出栈中所有数据:");
		
	while(p > s.base){
		
		p--;
		
		printf("%d ",*p);//*p表示p指向的变量值
		
	}	
	
	return 0;
		
}

9.进制转换(十进制转换为八进制)

int BaseConversion(stack &s){

	int N;

	InitStack(s);

	printf("\n请输入十进制数:");

	scanf("%d",&N);
	
	printf("十进制数%d转换为八进制数为:",N);
	
	while(N != 0){

		PushStack(s,N % 8);

		N = N/8;

	}

	while(s.top != s.base){

		s.top--;

		printf("%d",*s.top);

	}

	return 0;

}

10.主函数

int main(){
	
	stack s,p;
	
	int i,n,m,e;
	
	InitStack(s);
	
	printf("你想要输入几个数据:");
	
	scanf("%d",&n);
	
	printf("请输入数据:");
	
	for(i = 0;i < n;i++){
		
		++s.top;
		
		scanf("%d",s.top-1);
		
	}
	
	PrintStack(s);

	StackLength(s);
	
	printf("\n输入要插入的数据:");
	
	scanf("%d",&m);
	
	PushStack(s,m);
	
	PrintStack(s); 
	
	PopStack(s,e);

	BaseConversion(p);
	
	return 0;
	
}

以上程序依次写入Dev-C++和vscode均可运行

最后奉上一个运行结果
在这里插入图片描述

欢迎大家可以提出建议,希望可以与各位共同学习,增长知识!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值