天天看点

C-数据结构之顺序栈、链式栈

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;
}
           

顺序栈实验截图(由于链式和顺序栈截图都差不多,我就只放一张):

C-数据结构之顺序栈、链式栈

继续阅读