数组描述栈
#pragma warning(disable:4996) #include <iostream> #include<iterator> #include<algorithm> using namespace std; //边长一维数组(增加或减少) //改变一个一维数组的长度 template<class T> void changeLength1D(T*& a, int oldLength, int newLength) { if (newLength < 0) { cout << "错误:newLength 小于 0!"; exit(-1); } T* temp = new T[newLength]; int number = min(oldLength, newLength); copy(a, a + number, temp); delete[] a; a = temp; } template<class T> class stack { public: virtual ~stack() {}; virtual bool empty() const = 0; virtual int size() const = 0; virtual T& top() = 0; virtual void pop() = 0; virtual void push(const T& theElement) = 0; }; template<class T> class arrayStack :public stack<T> { public: arrayStack(int initialCapacity = 10); ~arrayStack() { delete[] stack; } bool empty() const { return stackTop == -1; } int size() const { return stackTop + 1; } T& top() { if (stackTop == -1) { cout << "栈中没有元素" << endl; exit(-1); } return stack[stackTop]; } void pop() { if (stackTop == -1) { cout << "栈中没有元素" << endl; exit(-1); } stack[stackTop--].~T(); } void push(const T& theElement); void output(ostream& out) const; private: friend ostream& operator<<(ostream& out, const arrayStack<T>& x); //当前栈顶 int stackTop; //栈容量 int arrayLength; //元素数组 T *stack; }; template<class T> arrayStack<T>::arrayStack(int initialCapacity) { if (initialCapacity < 1) { cout << "initialCapacity must be > 0" << endl; exit(-1); } arrayLength = initialCapacity; stack = new T[arrayLength]; stackTop = -1; } template<class T> void arrayStack<T>::push(const T& theElement) { //判断是否还有空间 if (stackTop == arrayLength - 1) { changeLength1D(stack, arrayLength, 2 * arrayLength); arrayLength *= 2; } stack[++stackTop] = theElement; } template<typename T> ostream& operator<<(ostream& out, const arrayStack<T>& x) { x.output(out); return out; } template<typename T> void arrayStack<T>::output(ostream& out) const { //把栈插入输出流 copy(stack, stack + stackTop + 1, ostream_iterator<T>(cout, " ")); } int main() { arrayStack<int> s; s.push(1); s.push(2); s.push(3); s.push(4); cout << "初始栈为:"; s.output(cout); cout << endl; cout << "栈顶元素" <<s.top() << endl; s.pop(); s.output(cout); cout << endl; cout << "栈存放的元素数量"<<s.size() << endl; system("pause"); return 0; }
链表描述栈
当用链表描述栈时,必须要确定用链表的哪段作为栈顶。若用链表的右端作为栈顶,则栈操作top、push和pop的实现需要用时O(size())。而用链表的左端作为栈顶,需要调用的链表方法是get(0)、insert(0,theElement)和erase(0),其中每一个链表方法需要用时O(1)。所以选择链表的左端作为栈顶。
#pragma warning(disable:4996) #include <iostream> using namespace std; //链表节点的结构定义 template<class T> struct chainNode { T element; chainNode<T> *next; chainNode() {} chainNode(const T& element) { this->element = element; } chainNode(const T& element, chainNode<T>* next) { this->element = element; this->next = next; } }; template<class T> class stack { public: virtual ~stack() {}; virtual bool empty() const = 0; virtual int size() const = 0; virtual T& top() = 0; virtual void pop() = 0; virtual void push(const T& theElement) = 0; }; template<class T> class linkStack :public stack<T> { public: linkStack() { stackTop = NULL; stackSize = 0; } ~linkStack(); bool empty() const { return stackSize == 0; } int size() const { return stackSize; } T& top() { if (stackSize == 0) { cout << "栈内无元素" << endl; exit(-1); } return stackTop->element; } void pop(); void push(const T& theElement); void output(ostream& out) const; private: friend ostream& operator<<(ostream& out, const linkStack<T>& x); //栈顶指针 chainNode<T>* stackTop; //栈中元素个数 int stackSize; }; template<class T> void linkStack<T>::pop() { if (stackSize == 0) { cout << "栈内无元素" << endl; exit(-1); } chainNode<T>* nextNode = stackTop->next; delete stackTop; stackTop = nextNode; stackSize--; } template<class T> void linkStack<T>::push(const T& theElement) { stackTop = new chainNode<T>(theElement, stackTop); stackSize++; } template<class T> linkStack<T>::~linkStack() { while (stackTop != NULL) { chainNode<T>* nextNode = stackTop->next; delete stackTop; stackTop = nextNode; } } template<typename T> ostream& operator<<(ostream& out, const linkStack<T>& x) { x.output(out); return out; } template<class T> void linkStack<T>::output(ostream& out) const { for (chainNode<T>* nextNode = stackTop; nextNode != NULL; nextNode = nextNode->next) out << nextNode->element << " "; } int main() { linkStack<int> s; s.push(1); s.push(2); s.push(3); s.push(4); cout << "初始栈为:"; s.output(cout); cout << endl; cout << "栈顶元素" <<s.top() << endl; s.pop(); s.output(cout); cout << endl; cout << "栈存放的元素数量"<<s.size() << endl; system("pause"); return 0; }
用数组栈解决括号匹配问题
int main() { arrayStack<int> s; string expr; getline(cin, expr); int length = (int)expr.size(); for (int i = 0; i < length; ++i) { if (expr[i] == '(') s.push(i); else if (expr[i] == ')') { if (s.empty()) cout << "没有和右括号"<<i<<"匹配的左括号" << endl; else { cout << s.top() << ' ' << i << endl; s.pop(); } } } while (!s.empty()) { cout << "没有和左括号"<<s.top()<<"匹配的右括号" << endl; s.pop(); } system("pause"); return 0; }