概述
写一个栈,可以作简单应用。
作为客户应用的main.cpp
//FileName : main.cpp
#include <iostream>
#include "stack.h"
using std::cout;
using std::endl;
int main(int argc, const char * argv[])
{
Stack st;
//and so on...
return 0;
}
头文件:stack.h
//FileName : stack.h
#ifndef __ex450__stack__
#define __ex450__stack__
#include <iostream>
//-----------------------------------------------------
const int INIT_SIZE = 10;
//-----------------------------------------------------
class Stack;
class StackNode{//栈单元
friend Stack;
private:
int data;
int* datapointer; //作其它应用
};
class Stack{
private:
StackNode* base; //栈底指针
StackNode* top; //栈顶指针,保证其始终指向的是未被填充元素的栈单元
int size; //栈容量
int length; //栈当前大小
public:
Stack(); //构造一个空栈,大小为默认值,值全部默认为0
Stack(int size,int data); //构造一个栈,大小为size,值全部为data
void Push(int data); //压入元素data
int Pop(); //弹出栈顶元素并返回
void Clear(); //清空栈
int Peek(); //返回栈顶元素值
bool IsEmpty(); //判空
bool IsFull(); //判满
~Stack(); //析构...
};
#endif
实现:stack.cpp
//FileName : stack.cpp
#include "stack.h"
using std::endl;
using std::cout;
Stack::Stack()
{
base = new StackNode[INIT_SIZE];
if(!base){exit(-1);}
top = base;
size = INIT_SIZE;
length = 0;
StackNode* p = base;
for (int i = 0; i < size; ++i) {
p->data = 0;
p->datapointer = 0; //NULL
++p;
}
}
Stack::Stack(int size,int data){
base = new StackNode[size];
if (!base) {
exit(-1);
}
StackNode* p = base;
for (int i = 0; i < size; ++i) {
p->data = data;
p->datapointer = 0; //NULL
++p;
}
top = p; //top指针到了界限外面了,但是没关系,Peek的时候回一位返回顶
this->size = size;
length = size;
}
Stack::~Stack(){
delete base;
top = base = nullptr;
}
void Stack::Clear(){
top = base;
length = 0;
}
bool Stack::IsEmpty(){
if(top == base){
return true;
}
else{
return false;
}
}
bool Stack::IsFull(){
if(length == size){
return true;
}
else{
return false;
}
}
int Stack::Peek(){
return (top - 1)->data;
}
void Stack::Push(int da){
if(!IsFull()){//栈未满,直接压入元素
top->data = da;
top->datapointer = nullptr;
++top;
++length;
}
else{//栈满,可以扩容再继续
StackNode* p = new StackNode[size * 2]; //申请原两倍的空间
StackNode* q = p;
StackNode* b = base;
for (int i = 0; i < size; ++i) {//复制原空间
*q++ = *b++;
}
delete base;
base = p;
top = q;
size *= 2;//完成扩容
//压入元素
top->data = da;
top->datapointer = nullptr;
++top;
++length;
}
}
int Stack::Pop(){
if(!IsEmpty()){
return (--top)->data;
}
else{
return 0;
}
}
如上便实现了一个简单的栈,没有用到什么高深的东西,实际上一些关于栈的有用的算法并未被写进来,只是为了解题需要写的东西。
最后
以上就是感动帽子为你收集整理的C++习题2——栈(简单)的全部内容,希望文章能够帮你解决C++习题2——栈(简单)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复