一、思路
- 1.用数组存储栈中的元素;
- 2.用top保存栈顶的位置;
- 3.进栈:top加1,然后在数组中的top位置插入x;
- 4.出栈:top减1
二、遇到问题
1.父类中有函数为纯虚函数,定义子类对象时,出现:“ XXX is an abstract class”
原因:
(a)一定要确保父类所有的纯虚函数都要被实现,否则子类依然不能被实例化;
(b)一定要确保继承的函数和父类声明的虚函数的形参类型与返回值类型一致,否则父类的虚函数没有实例化;
父类:virtual void Push() 会出现 "xxx referenced from"应该是指没有定义
原因这个是虚函数,要在父类里面有定义才行;纯虚函数则不需要在父类中定义

2.重载函数出错:ostream& operator<<(ostream &out, SeqStack<T> &s)

因为:友元函数在其它文件使用和定义(声明和定义、定义和使用在两个不同的文件)要加前置说明

同时要加<T>:

三、实现程序
1.Stack.h:
- #ifndef Stack_h
- #define Stack_h
-
- const int maxSize = 50;
-
- template <class T>
- class Stack {
- public:
- Stack(){}; // 构造函数
- void Push(const T x); // 新元素进栈
- bool Pop(); // 栈顶元素出栈
- virtual bool getTop(T &x) const = 0; // 读取栈顶元素,由x返回
- virtual bool isEmpty() const = 0; // 判断栈空否
- virtual bool isFull() const = 0; // 判断栈满否
- virtual int getSize() const = 0; // 计算栈中元素个数
- };
-
- #endif /* Stack_h */
2.SeqStack.h
3.main.cpp
- #include <iostream>
- #include "SeqStack.h"
- using namespace std;
-
- int main(int argc, const char * argv[]) {
- bool finished = false;
- int choice, n, val; // choice:选择
- SeqStack<int> obj;
-
- while(!finished) {
- cout << "\n*********菜单*********\n";
- cout << "1:建栈\n";
- cout << "2:压栈\n";
- cout << "3:出栈\n";
- cout << "4:取栈顶元素的值\n";
- cout << "5:栈是否为空\n";
- cout << "6:栈是否满\n";
- cout << "7:获取栈中元素的个数\n";
- cout << "8:清空栈的内容\n";
- cout << "9:输出栈中的所有元素\n";
- cout << "10:退出\n";
- cout << "请输入选择[1-10]:\n";
- cin >> choice;
- switch(choice) {
- case 1:
- cout << "请输入要进栈的元素个数:";
- cin >> n;
- cout << "请输入要进栈的元素值:" << endl;
- for(int i = 0; i < n; i++) {
- cin >> val;
- obj.Push(val);
- }
- break;
- case 2:
- cout << "请输入要进栈的元素值:" << endl;
- cin >> val;
- obj.Push(val);
- break;
- case 3:
- if(obj.Pop())
- cout << "出栈成功!" << endl;
- else
- cout << "出栈失败!" << endl;
- break;
- case 4:
- if(obj.getTop(val))
- cout << "栈顶元素为:" << val << endl;
- else
- cout << "栈为空!" << endl;
- break;
- case 5:
- if(obj.isEmpty())
- cout << "栈为空!" << endl;
- else
- cout << "栈不为空!" << endl;
- break;
- case 6:
- if(obj.isFull())
- cout << "栈满!" << endl;
- else
- cout << "栈不满!" << endl;
- break;
- case 7:
- int size;
- size = obj.getSize();
- cout << "栈中的元素个数为:" << size << endl;
- break;
- case 8:
- obj.makeEmpty();
- break;
- case 9:
- cout << obj << endl; // 重载输出<<
- break;
- case 10:
- finished = true;
- break;
- default:
- cout << "输入错误,请重新输入!" << endl;
- } // switch
- } // while
- return 0;
- }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。