1. 栈:先进后出(FILO) first in last out
两种常见的实现方法: 顺序栈(用顺序表实现栈的逻辑)
链式栈(用单链表实现栈的逻辑)
(1) 顺序栈
栈的初始化
压栈(入栈):把数据存放到栈里面
弹栈(出栈):把数据从栈里面取出来
栈的销毁
struct stack
{
int a[10]; //存放整数的顺序栈
int top; //标记目前栈顶位置
};
//初始化顺序栈
struct stack *init_stack()
{
struct stack *mystack=malloc();
mystack->top=-1;
return mystack;
}
//压栈 push_stack
int push_stack(int newdata,struct stack *stack)
{
//判断栈是否满了
if(stack->top>=N-1)
{
printf("栈已满!\n");
return -1;
}
//更新栈顶
stack->top++;
//newdata入栈
stack->a[stack->top]=newdata;
}
//出栈 pop_stack
int pop_stack(struct stack *stack)
{
//判断栈是否空了
if(stack->top<0)
{
printf("栈已空了!\n");
return -1;
}
//出栈
int result=stack->a[stack->top];
stack->top--;
return result;
}
//栈的销毁
int stack_uninit(struct seqstack *stack)
{
free(stack);
return 0;
}
队列:先进先出
int main()
{
//初始化一个栈
struct seqstack *mystack=stack_init();
//入栈几个数据
push(mystack,10);
push(mystack,11);
push(mystack,12);
//出栈几个数据
printf("目前出栈的数据: %d\n",pop(mystack));
printf("目前出栈的数据: %d\n",pop(mystack));
printf("目前出栈的数据: %d\n",pop(mystack));
printf("目前出栈的数据: %d\n",pop(mystack));
printf("目前出栈的数据: %d\n",pop(mystack));
//销毁顺序栈
stack_uninit(mystack);
return 0;
}
=========================================================================
改变主函数成顺序栈保存短除法求进制的结果。
int main()
{
int num;
int n;
int m; //保存余数
int result; //保存出栈的结果
//初始化一个栈
struct seqstack *mystack=stack_init();
printf("请输入一个整数!\n");
scanf("%d",&num);
printf("请输入你要求num的多少进制!\n");
scanf("%d",&n);
//循环不断地用num除以n,把余数入栈
while(num>n)
{
//保存余数
m=num%n;
//余数入栈
push(mystack,m);
//改变num的值
num=num/n;
}
push(mystack,num);
//出栈几个数据
while((result=pop(mystack))!=-1)
{
//由于16进制存在>=10的情况,需要用字母来表示
if(result>=10) //10-->a(97) 11-->b(98)
printf("目前出栈的结果是: %c\n",result+87);
else
printf("目前出栈的结果是: %d\n",result);
}
//销毁顺序栈
stack_uninit(mystack);
return 0;
}