DS006- 작동이 제한된 스택 선형 테이블의 원리 -C ++ STL 스택 템플릿 스택

이 기사에서는 먼저 순차 스택 및 체인 스택의 원리를 소개 한 다음 C ++ STL 스택 템플릿의 간단한 사용법을 소개합니다.

1. 스택이라는 용어가 도입 된 이유

일부 응용 프로그램에서 처리 된 데이터에는 다음과 같은 특성이 있습니다.

1. 선형 구조를 가지며 선형 테이블에 저장됩니다.

2. 그러나 간단한 작업 만 필요합니다. 선형 테이블의 한쪽 끝에서만 삽입 및 삭제합니다.

물론 이전에 구현 된 시퀀스 목록과 연결 목록을 사용할 수 있지만 일부 작업 만 사용됩니다.

선행을 가진 선배들은 '스택 (stack)'이라는 이름을 택했고, 한 번 더 용어와 부담을 더했습니다.

선형 테이블, 순차 테이블 및 연결된 테이블을 구현하는 두 가지 방법이 있습니다.

또한 두 개의 해당 스택이 있습니다.

둘째, 순차 스택

이것은 분석하려고합니다. 시퀀스 테이블을 스택으로 사용합니다. 어느 쪽에서 삽입하고 삭제해야합니까?

당연히 아래 첨자의 끝에 삽입하고 삭제하는 것은 다른 데이터를 이동할 필요가 없기 때문에 효율적입니다.

따라서 순차 스택의 삽입 작업 (스택으로 푸시)은 테이블의 끝에 삽입하는 것이고 스택의 삭제 작업 (풀)은 테이블의 끝에서 삭제하는 것입니다.



#include "stdafx.h"

#include<iostream> 
using namespace std;
//模板类,T是泛化类型
template<typename T>class stack
{//顺序栈
	T *base;//连续空间的首地址,栈底
	int listsize;//连续空间的大小
	int length;//实际元素的个数
	T *top;//栈顶
public:
	stack()
	{//构造函数
		init();
	}
	void init()
	{//对栈进行初始化
		base = new T[16];//初始时,占用16个空间,这个可以自己设置,一般是2的n次方
		listsize = 16;
		length = 0;
		top = base;
	}
	int enlarge()
	{//当L的空间不足时,本函数功能:将L的空间翻倍
	 //如果成功返回1,失败返回0

		T *newbase = new T[listsize * 2];//开辟新空间
		if (0 == newbase)
			return 0;
		for (int i = 0; i<length; i++)//把老空间已有数据拷贝到新空间
			newbase[i] = base[i];
		delete[]base;//释放掉老空间,还给操作系统
		base = newbase;//elem指向新空间首地址
		listsize = listsize * 2;//空间大小翻倍
		top = base + length;
		return 1;

	}
	void push(T x)
	{//入栈,即在顺序表尾部插入数据
		if (length == listsize)
		{//空间不足 
			enlarge();
		}

		*top = x;
		top++;
		length++;
	}

	void pop()
	{//出栈,删除顺序表表尾元素
		top--;
		length--;

	}
	int size()
	{//得到栈中元素个数
		return length;
	}
	int isEmpty()
	{//如果栈为空返回1,否则返回0
		return length == 0;
	}

	T getTop()
	{//得到栈顶元素
		return *(top - 1);

	}
	void print()
	{//测试用
		T *p = base;
		while (p < top)
		{
			cout << *p << "  ";
			p++;
		}
		cout << endl;

	}
	
	~stack()
	{
		delete[]base;
	}
};

int main()
{
	stack<int> s;

	s.push(1);
	s.push(3);
	s.push(5);
	s.print();

	int x;
	x = s.getTop();
	cout << "the top of stack is:" << x << endl;

	s.pop();
	s.print();
	s.pop();
	s.print();


	return 0;
}


세, 체인 스택

연결 목록을 스택으로 사용하면 어느 쪽 끝에 삽입하고 삭제해야합니까?

1. 단일 연결 목록을 사용하는 경우 헤드에서 삽입 및 삭제가 편리합니다.

2. 단방향 순환 연결 목록을 사용하는 경우 헤드에서 삽입 및 삭제하는 것이 편리합니다.

3. 양방향 순환 연결 목록을 사용할 때 더 편리합니다.

따라서 복잡성 측면에서 단일 연결 목록으로 스택을 구현하는 것이 더 간단합니다.



#include "stdafx.h"

#include<iostream> 
using namespace std;
//模板类,T是泛化类型
template<typename T>class stack
{//基于单链表的栈
	struct node
	{
		T data;
		node *next;
	};
	node *head;//头结点指针	
	int length;//实际元素的个数
	
public:
	stack()
	{//构造函数
		init();
	}
	void init()
	{//对栈进行初始化
		head = new node;
		head->next = 0;
		length = 0;
	}
	
	void push(T x)
	{//入栈,即在单链表头部插入数据
		node *t;
		t = new node;
		t->data = x;
		t->next = head->next;
		head->next = t;
		
		length++;
	}

	void pop()
	{//出栈,删除单链表表头元素
		node *t;
		t = head->next;
		head->next = t->next;
		delete t;
		length--;

	}
	int size()
	{//得到栈中元素个数
		return length;
	}
	int isEmpty()
	{//如果栈为空返回1,否则返回0
		return length == 0;
	}

	T getTop()
	{//得到栈顶元素
		node *t = head->next;
		return t->data;

	}
	void print()
	{//测试用
		node *p = head->next;
		while (p)
		{
			cout << p->data << "  ";
			p=p->next;
		}
		cout << endl;

	}
	
	~stack()
	{
		delete[]head;
	}
};

int main()
{
	stack<int> s;

	s.push(1);
	s.push(3);
	s.push(5);
	s.print();

	int x;
	x = s.getTop();
	cout << "the top of stack is:" << x << endl;

	s.pop();
	s.print();
	s.pop();
	s.print();


	return 0;
}


네, C ++ STL 스택

스택 템플릿 클래스는 C ++ STL로 정의되었습니다.

나중에 직접 사용할 수 있습니다.



#include "stdafx.h"

#include<stack>//C++ STL 栈模板头文件
#include<iostream> 
using namespace std;

template<typename T>

int main()
{
	stack<int> s;//定义一个整数栈
	int x;
	
	s.push(1);//入栈
	x = s.top();//得到栈顶元素
	cout << "the top of stack is:" << x << endl;

	s.push(3);
	x = s.top();
	cout << "the top of stack is:" << x << endl;

	s.push(5);
	x = s.top();
	cout << "the top of stack is:" << x << endl;
	
	

	s.pop();//出栈
	x = s.top();
	cout << "the top of stack is:" << x << endl;
	s.pop();
	x = s.top();
	cout << "the top of stack is:" << x << endl;


	return 0;
}


또한 : s.size ()는 스택의 요소 수를 가져옵니다.

s.empty ()는 스택이 비어 있는지 여부를 결정합니다.

첨자 연산을 제공하지 않기 때문에 그 안에있는 모든 요소를 ​​보는 것, 즉 순회하는 것은 매우 복잡합니다.

이러한 방식으로 요소를 스택에서 꺼내 인쇄하고 다른 스택에 저장 한 다음 최종적으로 복원합니다.

template<typename T>
void print(stack<T> &s)
{
	stack<T> s2;
	T x;
	while (s.empty() == false)
	{
		x = s.top();
		cout << x << " ";
		s2.push(x);
		s.pop();
	}
	cout << endl;

	while (s2.empty() == false)
	{
		x = s2.top();
		s2.pop();
		s.push(x);
	}

}

 

추천

출처blog.csdn.net/weixin_43917370/article/details/108571420