复习之前知道的知识点: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;
}