本文共 3671 字,大约阅读时间需要 12 分钟。
栈顶top
,与此对应的表头称为栈底bottom
。后进先出(Last In First Out,LIFO)
或先进后出(First In Last Out,FILO)
。n
个不同元素进栈,出栈元素不同排列的个数为: 卡特兰(Catalan)数
。顺序栈和链栈
。#pragma once#includeusing namespace std;class SeqStack{ private: // 存放元素 int* data; // 栈顶指针 int top; // 栈长 int length; // 最大栈长 int max;public: // 构造空栈 SeqStack(); // 初始化 bool InitStack(int a[], int len); // 判空 bool StackEmpty(); // 获取栈长 int StackLength(); // 获取栈顶元素 int getTop(); // 压栈 bool push(int value); // 弹栈 bool pop(int& e); // 遍历栈 void StackTraverse(); // 清空栈 bool clear();};SeqStack::SeqStack(){ this->data = NULL; this->top = -1; this->length = 0; this->max = 20;}bool SeqStack::InitStack(int a[], int len){ try { if (len > this->max) return false; this->data = new int[len]; for (int i = 0; i < len; i++) { this->data[i] = a[i]; this->top++; } this->length = len; return true; } catch (exception e) { cout << e.what() << endl; return false; }}bool SeqStack::StackEmpty(){ if (this->top == -1) return true; return false;}int SeqStack::StackLength(){ return this->length;}int SeqStack::getTop(){ if (this->StackEmpty()) return 0; return this->data[this->top];}bool SeqStack::push(int value){ if (this->top == this->max - 1) { cout << "栈已满,请先弹栈,再压栈!" << endl; return false; } this->data[length] = value; top += 1; length += 1;}bool SeqStack::pop(int& e){ if (top == -1) { cout << "栈已空,无法弹栈" << endl; return false; } e = data[top--]; length -= 1; return true;}void SeqStack::StackTraverse(){ if (this->StackEmpty()) { cout << "空栈!" << endl; return; } for (int i = top; i >= 0; i--) cout << data[i] << " "; cout << endl;}bool SeqStack::clear(){ if (this->StackEmpty()) { cout << "空栈!" << endl; return false; } top = -1; length = 0; return true;}
struct
比用 class
容易实现,代码如下:#pragma once#includeusing namespace std;typedef struct StackNode{ int data; int len; StackNode* next;}StackNode, * LinkStack;bool create(LinkStack& s){ s = NULL; return true;}bool init(LinkStack& s, int a[], int len){ try { LinkStack p; for (int i = 0; i < len; i++) { p = new StackNode; p->data = a[i]; p->next = s; p->len = i + 1; s = p; } s->len = len; return true; } catch (exception e) { cout << e.what() << endl; return false; }}int getTop(LinkStack s){ return s->data;}bool push(LinkStack& s, int value){ LinkStack p = new StackNode; p->data = value; p->next = s; p->len = s->len + 1; s = p; return true;}bool pop(LinkStack& s, int& e){ if (s == NULL) { cout << "栈空" << endl; return false; } e = s->data; LinkStack p = s; s = s->next; delete p; return true;}void traverse(LinkStack s){ LinkStack p = s; for (int i = 0; i < s->len; i++) { cout << p->data << " "; p = p->next; } cout << endl;}
利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别放置在共享空间的两端,两个栈顶向公共空间中间延申
。 top0=-1
时表示 0 号栈为空
,top1=Maxsize
时1号栈为空
。top1-top0=1
时,表示栈满。先top0+=1,再赋值
,1 号栈先 top1-=1 再赋值
。共享栈是为了更有效的利用存储空间
,两个栈的空间相互调节,只有整个存储空间都被占满时才发生上溢
。O(1)
。转载地址:http://xqqgn.baihongyu.com/