栈
这里只写顺序表存储版本的栈,链式存储参考上一篇博客《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; }