棧
這裏只寫順序表存儲版本的棧,鏈式存儲參考上一篇博客《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;
}