作为刚学习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
}
功能实现:
若有不妥之处,愿斧正。