栈的相关操作[代码在最后]

复习之前知道的知识点:1.指针+1或-1都是系统自动在sizeof自己的基础上完成的        2.malloc函数返回的地址在各个子函数里面的地址都不变,如下图:

所以,当你return  S->top++;时 不要以为 出了子函数就会局部变量清除,子函数调用的还是原来的地址,你的操作结果是累积的!!

疑点讲解:

关于stacksize 

其实你要理解栈的本质和核心是:base作为指针来malloc一块空间。

所以,我们可以用top表示下标(因为栈只在顶端操作所以只用到最大下标,并且这样可以不用多写stacksize表示内存了)

并且,空栈就是top=-1时,栈满就是top+1=MAX的时候。

-----------代码--------

/*栈的控制*/
/*栈的相关操作*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
#define limit 1000
typedef struct Stack{
	int *base;
	int top;
}Stack;
//构造一个空栈 
Stack initstack()
{
	Stack S;
	S.base=(int*)malloc(sizeof(int)*MAX);	
	S.top=-1;
	return S;
}
//判断栈是否为空
int emptyStack(Stack* S)
{
	if(S->top==-1)return 1;
	else return 0;
} 
//在栈顶插入元素
void push(Stack *S,int n)
{
	if(S->top==MAX){
		S->base=(int*)realloc(S->base,sizeof(int)*(MAX+20));		
		if(!S->base	){
			printf("\n扩容失败!");
			exit(0);
		}
	}
	S->base[S->top]=n;
	S->top++; 
} 
//打印栈
void print(Stack S)
{
	int i=0;
	if(S.top==-1){
		printf("\n空栈。");
		return;
	}
	printf("\n");
	for(i=0;i<S.top	;i++){
		printf("%d  ",S.base[i]);
	}
} 

//创建栈
void create(Stack *S)
{
	int i=0,m=0,n=0;
	printf("\n请输入栈的大小:");
	scanf("%d",&n);
	S->top=n-1;
	printf("\n请输入栈中所有元素:");
	for(i=0;i<S->top	;i++){
		printf("\n进来了。");
		scanf("%d",(S->base)+i);
	}
	for(i=0;i<S->top	;i++){
		printf("%d\t",S->base[i]);
	}
}

//删除栈顶元素
int pop(Stack *S)
{
	if(S->top==-1){
		printf("\n空栈。");
		return 0;
	}
	S->top--;
	return S->base[(S->top)+1];
} 

//把数字转换成二进制栈
void conversion(int n)
{
	Stack s;
	int x=0;
	s=initstack();
	while(n!=0){
		push(&s,n%2);
		n/=2;
	}
	printf("\n转换后的二进制数为:");
	while(s.top	!=-1){
		x=pop(&s);
		printf("%d  ",x);
	}
	free(s.base);
} 


int main(){
	Stack S;
	int n=0;
	S=initstack();
	create(&S);
	printf("\n请输入要插入的元素:");
	scanf("%d",&n);
	push(&S,n);
	printf("\n插入元素的栈后为:");
	print(S);	//
	pop(&S);
	printf("\n删除元素后的栈为:");
	print(S); 	//
	free(S.base);
	printf("\n请输入要转换的十进制数:");
	scanf("%d",&n);
	conversion(n);
	return 0;
}  

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值