11.27-学习笔记(今天终于把栈写了)
顺序栈的实现如下:
//栈的实现-只允许在一端进行插入或者删除操作的线性表(后进先出)
//栈顶、栈底、空栈
#include<stdio.h>
#define MaxSize 10
typedef struct stack{
int data[MaxSize];
int top;
}Sqstack;
//创建一个栈
void creat(Sqstack *s)//参数:栈的首地址
{
int e;
while(1)
{
printf("请输入想要入栈的元素:\n");
scanf("%d",&e);
if(e!=9999)
{
s->top++;
s->data[s->top]=e;
}
else
{
printf("创建成功\n");
break;
}
}
}
//压栈--只能从栈顶入栈
void insert(Sqstack *s)
{ int e;
//首先判断栈是否满了
if(s->top==MaxSize-1)
{
printf("栈满了,无法入栈\n");
}
//#其次入栈
else{
printf("请输入你想要入栈的元素\n");
scanf("%d",&e);
s->top++;
s->data[s->top]=e;
printf("压栈成功,当前元素位置为:%d",s->top);
}
}
//#遍历输出
void print(Sqstack s)
{
//#首先判断栈是否为空
if(s.top==-1)
{
printf("栈空\n");
}
else{
printf("当前元素为:");
while(s.top!=-1)
{
printf("%d",s.data[s.top]);
s.top--;
}
}
}
void del(Sqstack *s)
{
int x;
if(s->top==-1)
{
printf("栈空\n");
}
else{
x=s->data[s->top];
s->top--;
printf("当前出栈的元素为:%d",x);
}
}
int main(){
Sqstack s;
s.top=-1;//初始化栈顶指针
int num;
creat(&s);//传入栈的地址
while(num!=4){
printf("\n1.insert 2.del 3. print 4.quit\n");
scanf("%d",&num);
switch(num)
{
case 1:insert(&s);break;
case 2:del(&s);break;
case 3:print(s);break;
}
}
return 0;
}
链式栈的实现如下 :(链式栈的实质就是头插法的应用。)
//链式栈的实现--只能在一端进行插入和删除操作,也就是后进先出,因此插入和删除操作在表头进行
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode{
int data;
struct Linknode* next;
}Lnode,*Listack;
//使用头插法进行创建
Listack creat()
{
Listack s;
Lnode* q;
s=(Listack)malloc(sizeof(Lnode)) ;
s->next=NULL;
int e;
while(1)
{
printf("请输入要创建的元素\n");
scanf("%d",&e);
if(e!=9999)
{
q=(Listack)malloc(sizeof(Lnode));
q->next=s->next;
s->next=q;
q->data=e;
}
else{
printf("创建成功咯\n");
break;
}
}
return s;
}
void print(Listack s)
{
s=s->next;//从第一个结点开始
if(s==NULL)
{
printf("栈空\n");
}
else{
printf("当前栈的元素为:");
while(s!=NULL)
{
printf("%d",s->data);
s=s->next;
}
}
}
//使用头插法进行插入
Listack insert(Listack s)
{
int e;
Lnode *p;
printf("请输入想要入栈的元素:");
scanf("%d",&e);
p=(Listack)malloc(sizeof(Lnode));
p->next=s->next;
s->next=p;
p->data=e;
printf("插入成功\n");
return s;
}
Listack del(Listack s)
{
printf("开始出栈\n");
int x;
Lnode *q;
q=s->next;
x=q->data;//保存第一个结点的值
s->next=s->next->next;
free(q);
printf("当前出栈的元素为:%d",x);
return s;
}
int main(){
Listack s;
s=creat();
int num;
while(num!=4)
{
printf("\n1.insert 2.del 3. print 4.quit\n");
scanf("%d",&num);
switch(num)
{
case 1:insert(s);break;
case 2:del(s);break;
case 3:print(s);break;
}
}
return 0;
}
顺序栈实验截图(由于链式和顺序栈截图都差不多,我就只放一张):