数据结构学习2---队列和栈

队列节点

QueueNode.h
#pragma once
#include <iostream>
using namespace std;
template <class T>class QueueNode
{
public:
	T data;
	QueueNode<T>* next;
	QueueNode():next(NULL){};
	QueueNode(T val):data(val),next(NULL){}
};

链式队列

QueueList.h
#include "QueueNode.h"
#include <assert.h>
//no head node
//when insert the first node ,you need let the front node point it.
template <class T>class QueueList
{
public:
	QueueNode<T> *front;
	QueueNode<T> *rear;

	QueueList():front(NULL),rear(NULL){};

	bool IsEmpty()
	{
		return front==NULL;
	}
	void EnQueue(T val)
	{
		QueueNode<T>* add=new QueueNode<T>(val);
		if (IsEmpty())//when insert the first node ,you need let the front node point it.
		{
			front=rear=add;
		}
		else
		{
			rear->next=add;//when the head node exits,you just need change rear point.
 			rear=add;
		}
	}
	T DeQueue()
	{
		assert(!IsEmpty());
		QueueNode<T> *del=front;
		T val=del->data;
		front=front->next;
		if (del==rear)
		{
			rear=NULL;
		}
		delete del;
		return val;
	}
	void SetNull()
	{
		while (!IsEmpty())
		{
			DeQueue();
		}
	}
	void Traverse()
	{
		QueueNode<T>* p=front;
		while (p)
		{
			cout<<p->data<<" ";
			p=p->next;
		}
	}
	int GetFront()
	{
		if (IsEmpty())
			return 0;
		return front->data;
	}
};

循环队列

Queue.h
#include <assert.h>
#define MAX_SIZE 10
template<class T>class Queue
{
	int rear;
	int front;
	T * data;
public:
	Queue():front(0),rear(0)
	{
		data= new T[MAX_SIZE];
	}

	//判空
	bool IsEmpty()
	{
		return rear==front;
	}
	//判断满
	bool IsFull()
	{
		return (rear+1)%MAX_SIZE==front;
	}
	//入队
	bool EnQuene(T val)
	{
		if (IsFull())
			return 0;//队满
		data[rear]=val;
		rear=(rear+1)%MAX_SIZE;
		return 1;
	}
	T DeQueue()
	{
		if (IsEmpty())
			return -8888889;//队空
		T val=data[front];
		front=(front+1)%MAX_SIZE;
		return val;
	}
	T& GetFront()
	{
		assert(!IsEmpty());
		return data[front];
	}
	void Traverse()
	{
		if (IsEmpty())
			cout<<"队列为空!\n";
		else
		{
			int pos=front;
			while (pos!=rear)
			{
				cout<<data[pos]<<endl;
				pos=(pos+1)%MAX_SIZE;
			}
		}
	}
};

链式栈实现杨辉三角

/************************************************************************/
/* 链式栈实现杨辉三角 */
/************************************************************************/
 #include "QueueList.h"
 #include <iostream>
using namespace std;
template <class T>
 void Assign(QueueList<T>&Org,QueueList<T>&iter)
 {
 	Org.SetNull();
 	while (!iter.IsEmpty())
 	{
 		T temp=iter.DeQueue();
 		Org.EnQueue(temp);
 	}
 }
 void main()
 {

 	int n;
 	cout<<"显示的行数(>=3):\n";
 	cin>>n;
 	QueueList<int> Org;
 	Org.EnQueue(1);
 	Org.Traverse();
 	cout<<endl;
 	for (int i=1;i<n;i++)
 	{
 		QueueList<int> Iter;
 		Iter.EnQueue(1);
 		while (!Org.IsEmpty())
 		{
 			int OutQueue=Org.DeQueue();
 			Iter.EnQueue(OutQueue+Org.GetFront());
 		}
 		Iter.Traverse();
 		cout<<'\n';
 		Assign(Org,Iter);
 	}
 system("pause");

 }

游程编码问题

/************************************************************************/
/* 游程编码问题 */
/************************************************************************/
#include "QueueList.h"

void main()
{
	char a;
	QueueList<char> myQlist;
	cout<<"输入0,1序列,以#结束:\n";
	while (cin>>a && a!='#')
	{
		myQlist.EnQueue(a);
	}
	int count=0;
	char temp;
	char first=myQlist.GetFront();
	while (!myQlist.IsEmpty())
	{
		temp=myQlist.DeQueue();
		if (temp==first)
		{
			count++;
		}
		else
		{
			cout<<count;
			count=1;
		}
		first=temp;
	}
	cout<<count;
}

栈节点

StackNode.h
#pragma once
#include <stdlib.h>
template<class T>class StackNode
{
public:
	T data;
	StackNode<T>* next;
	StackNode(T value):next(NULL),data(value){}
};

链式栈

Stack.h
#include "StackNode.h"
#include <iostream.h>
template<class T> class Stack
{
private:
	StackNode<T>* top;
public:
	Stack():top(NULL){}
	void Push(T val)
	{
		StackNode<T>* add=new StackNode<T>(val);
		add->next=top;
		top=add;
	}
	T Pop()
	{
		if (IsEmpty())
			return -1;
		StackNode<T>* del=top;
		top=top->next;
		T data=del->data;
		delete del;
		return data;
	}
	bool IsEmpty()
	{
		return top==NULL;
	}
	T GetTop()
	{
		return top->data;
	}
	void MakeEmpty()
	{
		StackNode<T>* del=top;
		while (top)
		{
			top=top->next;
			delete top;
		}
	}
	void TraverseStack()
	{
		StackNode<T>* p=top;
		while (p)
		{
			cout<<p->data<<endl;
			p=p->next;
		}
	}
};

括号匹配

/************************************************************************/
/* 括号匹配 */
/************************************************************************/
#include "Stack.h"
void main()
{
	Stack<char> myStack;
	char a;
	cout<<"请输入括号形式(以0结束)\n";
	while (cin>>a&&a!='0')
	{
		switch (a)
		{
		case '(' :
			myStack.Push(a);
			break;
		case ')' :
			if (!myStack.IsEmpty())
			{
				myStack.Pop();
				break;
			}
		}
	}
	if (myStack.IsEmpty())
	{
		cout<<"Ok!"<<endl;
	}
	else
			cout<<"Wrong!"<<endl;
}

时间: 2024-09-18 04:21:41

数据结构学习2---队列和栈的相关文章

算法系列(六)数据结构之表队列和栈

在http://blog.csdn.net/robertcpp/article/details/51559333一文中,我们讲了排序,这一章来介绍一下基本数据结构:表.队列.栈和它们的简单实现 一.表ADT 1.数组实现顺序表 通过对数组操作,来直接对表进行增删查改操作,这种线性表查找某个位置的元素花费的时间为O(1),但是插入删除元素花费的时间为O(n),如果对表的操作更多的是访问操作,那么选择这种实现更为合适. 下面是一个简单实现 package com.algorithm.list; im

数据结构(08)_队列和栈的相互实现

1. 栈的队列的相互实现 思考:栈和队列在实现上非常相似,能否用相互实现? 1.1. StackToQueue 用栈实现队列等价于用"后进先出"的特性实现"先进先出"的特性.实现思路: 准备两个栈用于实现队列:stack_in和stack_out 入队列:当有新元素入队时,将其压入队列stack_in 出队列:当需要出队时:1.stack_out.size() == 0,将stack_in中的数据逐一弹出并压人stack_out(数据移动)2.stack_out.s

数据结构学习笔记-排序/队/栈/链/堆/查找树/红黑树

排序: 插入排序:每次从剩余数据中选取一个最小的,插入已经排序完成的序列中 合并排序:将数据分成左右两组分别排序,然后合并,对每组数据的排序递归处理. 冒泡排序:重复交换两个相邻元素,从a[1]开始向a[0]方向冒泡,然后a[2]...当a[i]无法继续往前挤的时候说明前面的更小了,而且越往前越小(挤得越往前) 堆排序:构造最大堆,每次取走根结点(自然是最大的),再调用MAX-HEAPIFY算法(见后文的堆)恢复最大堆的性质,重复取走根结点 快速排序(对A[r]-A[n]进行排序): 1.从序列

数据结构学习(循环队列)

1. 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定 2. 这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front [满] rear == front [空] package cn.imut; //循环队列 import java.util.Scanner; public class CircleArrayQueueDemo { public static void main(String[] args) { System.out.prin

[数据结构学习]单调队列

单调队列,即内部元素相对于比较器有序的队列,可以方便的查询序列中某个连续区间内的最大/最小值 也能在状态转移时优化决策以降低时间复杂度.(嗯,这句是OI-Wiki上说的,作为蒟蒻qwq我并不知道如何优化dp) 比如我们想知道一个长为n的数字序列中每连续k个数中最小的那个数 如果暴力求解的话,遍历从1~n-k+1,复杂度O(n*k),而且需要将每个子序列中的值与其他值进行比较,是比较慢的=-= 对于这个问题就可以维护一个递减的单调队列,同时注意队列中的数字区间不要超过k 维护的方法: 每读入序列中

数据结构学习总结 栈和队列

一,顺序栈的基本操作 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图 1 所示.                                                               图 1 栈存储结构示意图 从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求: 1,栈只能从表的一端存取数据,另一端是封闭的,如图 1 所示

小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈

小猪的数据结构辅助教程--3.1 栈与队列中的顺序栈 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点 1.栈与队列的介绍,栈顶,栈底,入栈,出栈的概念 2.熟悉顺序栈的特点以及存储结构 3.掌握顺序栈的基本操作的实现逻辑 4.掌握顺序栈的经典例子:进制变换的实现逻辑 1.栈与队列的概念: 嗯,本节要进行讲解的就是栈 + 顺序结构 = 顺序栈! 可能大家对栈的概念还是很模糊,我们找个常见的东西来拟物化~ 不知道大家喜欢吃零食不--"桶装薯片"就可以用来演示栈! 生产的时

浅谈算法和数据结构(1):栈和队列

浅谈算法和数据结构(1):栈和队列 2014/11/03 ·  IT技术                                         · 2 评论                                      ·  数据结构, 栈, 算法, 队列 分享到: 60 SegmentFault D-Day 2015 北京:iOS 站 JDBC之“对岸的女孩走过来” CSS深入理解之relative HTML5+CSS3实现春节贺卡 原文出处: 寒江独钓   欢迎分享原创

小猪的数据结构辅助教程——3.2 栈与队列中的链栈

小猪的数据结构辅助教程--3.2 栈与队列中的链栈 标签(空格分隔): 数据结构 1.本节引言: 嗯,本节没有学习路线图哈,因为栈我们一般都用的是顺序栈,链栈还是顺带提一提吧, 栈因为只是栈顶来做插入和删除操作,所以较好的方法是将栈顶放在单链表的头部,栈顶 指针与单链表的头指针合二为一~所以本节只是讲下链栈的存储结构和基本操作! 2.链栈的存储结构与示意图 存储结构: typedef struct StackNode { SElemType data; //存放的数据 struct StackN