实验目的
(1) 掌握堆栈的定义及基本操作的实现
(2) 掌握顺序栈与链栈的区别与特点
(3) 掌握堆栈的应用场景与实际编程
实验内容
编写算法,借助堆栈将一个单链表置逆。
【提示】利用栈后进先出的特点,将单链表中的结点从链表头开始依次压栈,然后再依次出栈,采用尾插法重新生成单链表。
实验代码
#include <iostream>
#include <cstdlib>
using namespace std;
typedef int datatype;
#define MAX 1024
//单链表的结点
typedef struct lnode {
datatype data;
struct lnode *next;
} LNode, *LinkList;
//栈的结点
typedef struct{
datatype data[MAX];
int top;
}SeqStack;
//创建带头结点的单链表L,采取尾插法
LinkList createLinkList(int n) {
LinkList L = (LNode*)malloc(sizeof(LNode));//头指针指向头结点
LNode *p, *r = L;//区别:尾指针的初始化
datatype x;
int i = 0;
while(i < n) {
cin >> x;
p = (LNode*)malloc(sizeof(LNode));
p->data = x;
r->next = p;//区别
r = p; //r指向新的尾结点
i++;
}
if(r != NULL)
r->next = NULL;//对于非空表,最后结点的指针域置空
return L;
}
void printLink(LinkList L) //遍历
{
LNode *p = L;
while(p->next != NULL) {
p = p->next;
cout << p->data << " ";
}
cout << endl;
}
SeqStack* Init_SeqStack()//初始化
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=-1;
return s;
}
int Empty_SeqStack(SeqStack* s)//判空
{
if(s->top==-1) return 1;
else return 0;
}
int Push_SeqStack(SeqStack *s,datatype x)//入栈
{
if(s->top==MAX-1) return 0;
else{
s->top++;
s->data[s->top]=x;
return 1;
}
}
int Pop_SeqStack(SeqStack* s,datatype *x)//出栈
{
if(Empty_SeqStack(s)) return 0;
else{
*x=s->data[s->top];
s->top--;
return 1;
}
}
void ReverseList(LinkList L)
{
SeqStack *stk;
stk=Init_SeqStack();
LinkList p=L->next;
while(p)
{
Push_SeqStack(stk,p->data);
p=p->next;
}
p=L->next;
while(p)
{
p->data=stk->top;
Pop_SeqStack(stk,&(p->data));
p=p->next;
}
}
int main() {
LinkList L = NULL;//定义头指针变量
LNode *p;//存储结点所在的位置
int n, i;
datatype x;
cout << "输入元素的个数n:";
cin >> n;
cout << "输入元素:";
L = createLinkList(n);
cout<<"-----------------------------"<<endl;
cout<<"原链表: ";
printLink(L);
cout<<"逆置后单链表:";
ReverseList(L);
printLink(L);
return 0;
}
#实验结果