堆栈的简单应用

实验目的

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

#实验结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hey pear!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值