初试顺序栈与链栈功能实现

作为刚学习c语言的小白,初试实现顺序栈和链栈功能(如有问题希望能够指出)

注:只是建立一种方式实现类似两栈功能

#define MAXSIZE 100; /*顺序栈的最大长度*/
typedef struct SqStack { 
	int base[100];  /*存储栈中数据元素的数组*/
    int top;   /*top为栈顶指针,它指示栈顶元素的存储空间的下一个存储单元*/
}Sqstack;

此处在开头定义顺序栈结构体(在测试时,已宏定义MAXSIZE为100,但在结构体内base[MAXSIZE]会有语法问题,这是啥原因呢?)

#include<stdio.h>
main()
{
	int e,i,n,h;
    Sqstack s;      //定义顺序栈
	s.top=0;
	printf("顺序栈建立,入栈出栈实验:\n");
    printf("请输入入栈元素个数n(0~100):");
	scanf("%d",&n);
	printf("请输入入栈元素:");
	for(i=0;i<n;i++)
	{
		scanf("%d",&e);
		s.base[s.top++]=e;
	}                                 //入栈
for(i=0;i<n;i++)
	printf("%d ",s.base[--s.top]);     //打印栈

此处为顺序栈元素入栈定义,e为入栈元素,定义一个结构体s,初始化定义s.top=0;便于使结构体内数组从首地址访问。利用for循环使元素入栈。循环结束后s.top=n,如果要输出栈,则输出为s.base[--s.top],即s.base[n-1]开始输出,实现顺序栈先入后出的功能。

printf("\n请输入要额外入栈元素e:");
	scanf("%d",&e);
	for(i=0;i<n;i++)
		s.top++;             
	s.base[s.top]=e;         
	for(i=0;i<=n;i++)
		printf("%d ",s.base[s.top--]);

新元素入栈,上一步循环中已使s.top=0,新元素入栈需要将s.top=n(先前定义的原入栈元素个数)使得s.base[n]=e,此时数组内元素为n+1个,输出for循环内注意i<=n,而且输出需是s.top--,即从s.base[n]开始输出

上文完成元素入栈和新元素入栈功能。

printf("\n请输入要出栈的元素个数h:");
	scanf("%d",&h);
	for(i=0;i<=n;i++)
		s.top++;
    printf("\n顶栈元素出栈是:%d",s.base[s.top]);  //顶栈元素出栈后输出
	for(i=0;i<h;i++)
		--s.top;
	printf("\n出栈后剩余元素是:");
	for(i=0;i<=n-h;i++)
		printf("%d ",s.base[s.top--]);    //出栈

此处为栈内元素出栈,并输出顶栈元素出栈值。同样需要注意s.top在上文操作后的值并将其赋值到n,即第一个for循环,顺序栈是先进后出,第二个for循环是使s.top的值改变到剩余元素的第一位(相当于出栈后顶栈元素),第三个for循环则是输出。

到此处,“顺序栈”就完成了。

typedef struct StackNode{
   int data;
   struct StackNode *next;
}stacknode,*Linkstack;

定义链栈的结构体

    Linkstack p,head,q,tail;     //定义链栈
	printf("\n链栈建立,入栈出栈实验:");
	printf("\n请输入要入栈的元素个数n:");
	scanf("%d",&n);
	printf("请输入入栈元素:");
	for(i=0;i<n;i++)
	{
      p=(Linkstack)malloc(sizeof(stacknode));
	  scanf("%d",&p->data);
	  p->next=tail;
	  tail=p;
	  if(i==0)
		  p->next=NULL;
	}
	head=p;
	q=p;
	for(q=head;q!=NULL;q=q->next)
		printf("%d ",q->data);            //头插法建立链表

此处定义链栈(在测试时Linkstack定义在scanf函数下,报错了,似乎这是某些c语言的兼容问题吗?)利用头插法可实现先进后出的功能

printf("\n请输入要额外插入的元素e:");
    p=(Linkstack)malloc(sizeof(stacknode));
	scanf("%d",&p->data);
	p->next=tail;
	head=p;
	q=p;
	for(q=head;q!=NULL;q=q->next)
		printf("%d ",q->data);         //入栈

新元素入栈,需要再开辟空间,注意先前p与tail的位置。

printf("\n请输入要出栈元素个数h:");
	scanf("%d",&h);
	printf("\n顶栈元素出栈为:%d",p->data);
	for(i=0;i<h;i++)
      p=p->next;
	head=p;
	q=p;
	printf("\n出栈后剩余元素为:");
	for(q=head;q!=NULL;q=q->next)
		printf("%d ",q->data);     //出栈    

同上此为出栈功能。

在实现链栈功能,最大注意就是p,tail现所在位置。

完整代码:

#define MAXSIZE 100; /*顺序栈的最大长度*/
typedef struct SqStack { 
	int base[100];  /*存储栈中数据元素的数组*/
    int top;   /*top为栈顶指针,它指示栈顶元素的存储空间的下一个存储单元*/
}Sqstack;

typedef struct StackNode{
   int data;
   struct StackNode *next;
}stacknode,*Linkstack;

#include<stdio.h>
#include<stdlib.h>
main()
{
	int e,i,n,h;
    Sqstack s;      //定义顺序栈
    Linkstack p,head,q,tail;     //定义链栈
	s.top=0;
	printf("顺序栈建立,入栈出栈实验:\n");
    printf("请输入入栈元素个数n(0~100):");
	scanf("%d",&n);
	printf("请输入入栈元素:");
	for(i=0;i<n;i++)
	{
		scanf("%d",&e);
		s.base[s.top++]=e;
	}                                 //入栈
	for(i=0;i<n;i++)
	printf("%d ",s.base[--s.top]);     //打印栈
	printf("\n请输入要额外入栈元素e:");
	scanf("%d",&e);
	for(i=0;i<n;i++)
		s.top++;             
	s.base[s.top]=e;         
	for(i=0;i<=n;i++)
		printf("%d ",s.base[s.top--]);
	printf("\n请输入要出栈的元素个数h:");
	scanf("%d",&h);
	for(i=0;i<=n;i++)
		s.top++;
    printf("\n顶栈元素出栈是:%d",s.base[s.top]);
	for(i=0;i<h;i++)
		--s.top;
	printf("\n出栈后剩余元素是:");
	for(i=0;i<=n-h;i++)
		printf("%d ",s.base[s.top--]);    //出栈
	printf("\n-----------------------------");                //顺序栈入出栈建立end
	printf("\n链栈建立,入栈出栈实验:");
	printf("\n请输入要入栈的元素个数n:");
	scanf("%d",&n);
	printf("请输入入栈元素:");
	for(i=0;i<n;i++)
	{
      p=(Linkstack)malloc(sizeof(stacknode));
	  scanf("%d",&p->data);
	  p->next=tail;
	  tail=p;
	  if(i==0)
		  p->next=NULL;
	}
	head=p;
	q=p;
	for(q=head;q!=NULL;q=q->next)
		printf("%d ",q->data);            //头插法建立链表
	printf("\n请输入要额外插入的元素e:");
    p=(Linkstack)malloc(sizeof(stacknode));
	scanf("%d",&p->data);
	p->next=tail;
	head=p;
	q=p;
	for(q=head;q!=NULL;q=q->next)
		printf("%d ",q->data);         //入栈
	printf("\n请输入要出栈元素个数h:");
	scanf("%d",&h);
	printf("\n顶栈元素出栈为:%d",p->data);
	for(i=0;i<h;i++)
      p=p->next;
	head=p;
	q=p;
	printf("\n出栈后剩余元素为:");
	for(q=head;q!=NULL;q=q->next)
		printf("%d ",q->data);     //出栈    
	printf("\n-----------------------------");   //链表入出栈建立end
}

功能实现:

若有不妥之处,愿斧正。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米芝鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值