1. 写在前面
代码不是源代码,不能直接用。
2. 题目要求
使用游标形式使得三栈共享。
用一维数组A[m]存储空间建立三个栈,其中前三个单元的next存放三个栈顶的指针, 第四个单元起共享。
从键盘输入n个整数按下列条件进栈:
(1) t<80 进1栈
(2) 80=<t<=100 进2栈
(3) t>100 进3栈
3. 代码
3.1 结构体和函数声明
//#define MAX
typedef struct node
{
int data;
int next;
} Node;
int Share(Node A[], int n);
void Print(Node A[]);
void Cancel(Node A[], int top, int n);
3.2 主函数
void main()
{
Node A[MAX];
int top=Share(A, n); //n为入栈的元素个数
Print(A);
Cancel(A, top, n);
Print(A);
}
3.3 构建三栈共享
int Share(Node A[], int n) //参考头插法
{
for(i=0; i<3; i++) //存储空间建立三个栈,其中前三个单元的next存放三个栈顶的指针
A[i].next=0;
for(i=3; i<n+2; i++) //n个元素
A[i].next=i+1;
A[n+2].next=0;
for(i=n+3; i<MAX; i++)
A[i].next=i+1;
A[MAX-1].next=0;
top=3; //top栈顶
for(i=3; i<=n+2; i++)
{
j=top;
//读取进栈元素
A[j].data=t;
//以下确定top值
if(i==n+2)
top=n+2;
else
top=A[j].next;
//
if(压入一栈)
{
A[j].next=A[0].next;
A[0].next=j;
}
else if(压入二栈)
//同理
else if(压入三栈)
//同理
}
return top;
}
入栈的方式可以参考链表的头插法,至于尾插法是否可行读者可以自行研究。
3.4 输出各栈元素
void Print(Node A[])
{
for(i=0; i<3; i++)
{
j=A[i].next;
if(j==0)
printf("栈空");
while(j!=0)
{
printf(A[j].data);
k=j;
j=A[k].next;
}
printf("\n");
}
}
3.5 出栈
void Cancel(Node A[], int top, int n)
{
//输入删除第几栈元素的选择
//此前需要确保出栈选择不空,自己写
i=A[ch].next;
A[ch].next=A[i].next;
A[i].next=n+3; //回收,将空闲链到待用的表头
top=i; //此时top为删除后的元素下标
}
出栈要保证“先入后出”。
4. 声明
博客园地址:槐桕 - 博客园