C++_012_數據結構_棧_順序表儲存版

    這裏只寫順序表存儲版本的棧,鏈式存儲參考上一篇博客《C++_011_數據結構_循環雙鏈表_混合鏈表》的寫法,這裏不做贅述。
    除此之外,本篇給出一些關於棧的常用算法。
    棧其實就是線性表的變種,只不過,只能在線性表的尾部插入和刪除。

包含的主要知識點

1.棧的線性存儲寫法。
2.用棧寫多種類型括號匹配的算法。
3.十進制轉任意進制的算法。

運行截圖


主函數

// 棧_普通版.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include"Stack.cpp"
void Conversion(Stack<int> &a , int num, int r);//十進制轉化爲 r 進制後存儲在棧中。
bool brackets(char s[]);//檢測括號匹配。

int main()
{
	int arr[3] = { 1,2,3 };
	Stack<int> a(arr,3);
	cout <<"原始棧:"<< a;
	a.Pop();
	cout << "彈出棧頂:" << a;
	a.Push(999);
	cout << "壓入 999 後:" << a << endl;

	Stack<int> b;
	cout << "將 154 轉化爲 8 進制:";
	Conversion(b, 145, 8);
	cout << endl;
	Stack<int> c;
	cout << "將 154 轉化爲 16 進制:";
	Conversion(b, 154, 16);
	cout << endl<<endl;

	cout << "判斷:<<{}()>> 是否匹配:";
	char s1[] = "<<{}()>>";
	if (brackets(s1))
	{
		cout << "是。" << endl;
	}
	else
	{
		cout << "否。" << endl;
	}

	cout << "判斷:<3+5*8<-66{***}090(56)LA>> 是否匹配:";
	char s2[] = "<3+5*8<-66{***}090(56)LA>>";
	if (brackets(s2))
	{
		cout << "是。" << endl;
	}
	else
	{
		cout << "否。" << endl;
	}

	cout << "判斷:{}[<]>是否匹配:";
	char s3[] = "{}[<]>";
	if (brackets(s3))
	{
		cout << "是。" << endl;
	}
	else
	{
		cout << "否。" << endl;
	}
	getchar();
    return 0;
}

void Conversion(Stack<int> &a, int num, int r)
{
	char base[17] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
	while (num)
	{
		a.Push(num%r);
		num /= r;
	}
	while (!a.IsEmpty())
	{
		cout << base[a.Pop()];
	}
}

bool brackets(char s[])
{
	/*四種括號: ()  {}  [] <>  */
	/*遇到括號就入棧,最後看是否對稱。*/

	Stack<char>  a;
	for (int i = 0; s[i] != '\0'; i++)
	{
		
		switch (s[i])
		{
			case '(':
			{
				a.Push('(');
				break;
			}
			case ')':
			{
				if (a.Pop() != '(')
				{
					return false;
				}
				break;
			}
			case '{':
			{
				a.Push('{');
				break;
			}
			case '}':
			{
				if (a.Pop() != '{')
				{
					return false;
				}
				break;
			}
			case '[':
			{
				a.Push('[');
				break;
			}
			case ']':
			{
				if (a.Pop() != '[')
				{
					return false;
				}
				break;
			}
			case '<':
			{
				a.Push('<');
				break;
			}
			case '>':
			{
				if (a.Pop() != '<')
				{
					return false;
				}
				break;
			}
			default:
			{
				continue ;
			}
		}

	}
	if (a.IsEmpty())
	{
		return true;
	}
	else
	{
		return false;
	}
}

棧的頭文件

#pragma once
#include<iostream>
#include<ostream>
using namespace std;
#define MaxSize 100

template<typename T>
class Stack;

template<typename T>
ostream& operator<< (ostream& out, Stack<T> & a);

template<typename T>
class Stack
{
public:
	Stack();//默認構造函數
	Stack(T a[],int Length);//含參構造函數。
	~Stack();//析構函數
private:
	int Top;//棧頂
	T Data[MaxSize];//數據
public:
	void InitStack();//初始化操作函數。
	void DestroyStack();//銷燬棧。
	void Push(T Obj);//壓棧。
	T Pop();//彈出棧頂。
	T GetTop();//獲取棧頂數據。
	bool IsEmpty();//判斷是否爲空棧。
	bool IsFull();//判斷棧是否滿。
	int GetSize();//獲取棧存儲數據的總個數。

	friend ostream& operator<< <>(ostream& out, Stack<T> & a);//輸出函數。
};

template<typename T>
ostream & operator<< (ostream & out, Stack<T>& a)
{
	for (int i = 0; i <= a.Top; i++)
	{
		out << a.Data[i] << " ";
	}
	out << endl;
	return out;
}

源文件

#include "stdafx.h"
#include "Stack.h"

template<typename T>
Stack<T>::Stack()
{
	Top = -1;
}

template<typename T>
Stack<T>::Stack(T a[], int Length)
{
	if (Length<0 || Length>MaxSize)
	{
		throw "Stack(T a[],int Length) wrong.\n";
	}
	for (Top = 0; Top < Length; Top++)
	{
		Data[Top] = a[Top];
	}
	Top--;
}

template<typename T>
Stack<T>::~Stack()
{
	Top = -1;
}

template<typename T>
void Stack<T>::InitStack()
{
	cout << "初始化棧,這裏不需要初始化。" << endl;
}

template<typename T>
void Stack<T>::DestroyStack()
{
	Top = -1;
}

template<typename T>
void Stack<T>::Push(T Obj)
{
	Data[Top+1] = Obj;
	Top++;
}

template<typename T>
T Stack<T>::Pop()
{
	Top--;
	return Data[Top+1];
}

template<typename T>
T Stack<T>::GetTop()
{
	return Data[Top];
}

template<typename T>
bool Stack<T>::IsEmpty()
{
	return Top<0?true:false;
}

template<typename T>
bool Stack<T>::IsFull()
{
	return Top > MaxSize - 1 ? true: false ;
}

template<typename T>
int Stack<T>::GetSize()
{
	return Top+1;
}


發佈了74 篇原創文章 · 獲贊 34 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章