c++栈 编写一个类实现简单的栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++栈 编写一个类实现简单的栈相关的知识,希望对你有一定的参考价值。

chu xue zhe a
ge wei bang bang mang ha

编写一个类,实现简单的栈操作:元素入栈,读出栈顶元素值,退栈,判断栈顶元素是否为空。如果栈溢出,程序终止。栈的数据成员有10个整形数组构成。先后作如下操作:
将10入栈;
将12入栈;
将14入栈;
读出栈顶元素;
退栈;
读出并输出栈顶元素。

#include<iostream>
using namespace std;

class Stack

public:
Stack()

top=-1;

bool push(int n)//压栈

if(!isfull())
data[++top]=n;
else
return false;
return true;

bool pop()//退栈

if(!isempty())
top--;
else
return false;
return true;

int gettop()//得到栈顶元素

return data[top];

bool isempty()//判断是否为空

return top==-1?true:false;

bool isfull()//判断是否已满

return top==9?true:false;

private:
int data[10];
int top;
;

int main()

Stack s;//建立一个栈
if(!s.push(10))//将10入栈;

cout<<"栈溢出"<<endl;
return 0;

if(!s.push(12))//将12入栈;

cout<<"栈溢出"<<endl;
return 0;

if(!s.push(14))//将14入栈;

cout<<"栈溢出"<<endl;
return 0;

cout<<s.gettop()<<endl;//读出并输出栈顶元素;
s.pop();//退栈
cout<<s.gettop()<<endl;//读出并输出栈顶元素;

如上类,这是可以存储10个整型数空间的栈。
参考技术A #include<iostream>
using namespace std;

class Stack

public:
Stack()

top=-1;

bool push(int n)//压栈

if(!isfull())
data[++top]=n;
else
return false;
return true;

bool pop()//退栈

if(!isempty())
top--;
else
return false;
return true;

int gettop()//得到栈顶元素

return data[top];

bool isempty()//判断是否为空

return top==-1?true:false;

bool isfull()//判断是否已满

return top==9?true:false;

private:
int data[10];
int top;
;

int main()

Stack s;//建立一个栈
if(!s.push(10))//将10入栈;

cout<<"栈溢出"<<endl;
return 0;

if(!s.push(12))//将12入栈;

cout<<"栈溢出"<<endl;
return 0;

if(!s.push(14))//将14入栈;

cout<<"栈溢出"<<endl;
return 0;

cout<<s.gettop()<<endl;//读出并输出栈顶元素;
s.pop();//退栈
cout<<s.gettop()<<endl;//读出并输出栈顶元素;

如上类,这是可以存储10个整型数空间的栈。
参考技术B #include <iostream>
using namespace std;

#define STACKSIZE 100
typedef char DataType;

void Error(char* _pchMessage);

typedef class CStack

private:
DataType m_Data[STACKSIZE];
int m_nTop;
public:
CStack();
~CStack();
void InitStack();
int StackEmpty();
int StackFull();
void PushStack(DataType _Temp);
DataType PopStack();
DataType StackTop();
void ShowStack();

SeqStack;

CStack::CStack()

for(int i = 0; i < STACKSIZE; ++i)

m_Data[i] = 0;

m_nTop = -1;


CStack::~CStack()



void CStack::InitStack()

//将顺序栈置空
for(int i = 0; i < STACKSIZE; ++i)

m_Data[i] = 0;

m_nTop = -1;


int CStack::StackEmpty()

return m_nTop == -1;


int CStack::StackFull()

return m_nTop == STACKSIZE - 1;


void CStack::PushStack(DataType _Temp)

if(STACKSIZE - 1 == m_nTop)

Error("Stack overflow.");
return ;


m_Data[++m_nTop] = _Temp;


DataType CStack::PopStack()

if( -1 == m_nTop)

Error("Stack underflow.");
return -1;


return m_Data[m_nTop--];


DataType CStack::StackTop()

if( -1 == m_nTop)

Error("Stack underflow.");
return -1;


return m_Data[m_nTop];


void CStack::ShowStack()

if(-1 == m_nTop)

cout << "此栈为空!" << endl;

else

for(int i = m_nTop; i > -1; --i)

cout << m_Data[i] << '\t' << endl;




int main()

SeqStack* pStack= new SeqStack;
pStack->InitStack();

if(pStack->StackEmpty())

cout << "此栈已空!" << endl;


if(pStack->StackFull())

cout << "此栈已满!" << endl;


pStack->PushStack('a');
pStack->PushStack('b');
pStack->PushStack('c');
pStack->PushStack('d');
pStack->PushStack('e');

cout << "PopStack = " << pStack->PopStack() << endl;
cout << "StackTop = " << pStack->StackTop() << endl;

pStack->ShowStack();

delete pStack;
pStack = NULL;

return 0;


void Error(char* _pchMessage)

fprintf(stderr, "Error: %s\n", _pchMessage);
cout << _pchMessage << endl;
参考技术C #include<iostream>
using
namespace
std;
class
Stack

public:
Stack()

top=-1;

bool
push(int
n)//压栈

if(!isfull())
data[++top]=n;
else
return
false;
return
true;

bool
pop()//退栈

if(!isempty())
top--;
else
return
false;
return
true;

int
gettop()//得到栈顶元素

return
data[top];

bool
isempty()//判断是否为空

return
top==-1?true:false;

bool
isfull()//判断是否已满

return
top==9?true:false;

private:
int
data[10];
int
top;
;
int
main()

Stack
s;//建立一个栈
if(!s.push(10))//将10入栈;

cout<<"栈溢出"<<endl;
return
0;

if(!s.push(12))//将12入栈;

cout<<"栈溢出"<<endl;
return
0;

if(!s.push(14))//将14入栈;

cout<<"栈溢出"<<endl;
return
0;

cout<<s.gettop()<<endl;//读出并输出栈顶元素;
s.pop();//退栈
cout<<s.gettop()<<endl;//读出并输出栈顶元素;

如上类,这是可以存储10个整型数空间的栈。

设计一个获取最小值时间复杂度为O的栈

【题目】

  • 实现一个栈,在实现栈的基本功能的前提下,再实现返回最小元素的操作。

【要求】

  • pop、push、getMin操作的时间复杂度都是O(1)
  • 设计的类可以使用现成的栈结构。

【分析】

  • 想要使得获取最小值的时间复杂度为O(1),最简单的方法就是提前将最小值记录下来,当我们需要获取时便可直接获取
  • 栈的特点就是先进后出。它的操作具有一定规律,这使得我们可以很好的记录最小值。
  • 很容易就能够想到“双栈”来实现

【实现】

  • 实现语言:C++
  • 源代码如下:
#include<iostream>
#include<stack> 
using namespace std;

#define Error -1

// 一个有获取最小值功能的特殊栈,获取最小值的时间复杂度为O(1) 
class GetMinStack
{
	private:
	stack<int> m_BasicStack;                 //主栈
	stack<int> m_MinNumStack;                //最小值栈
	

	public:	
	void push(int value)                     //入栈
	{
		if(m_BasicStack.empty())            //如果栈中无数据
			m_MinNumStack.push(value);        
		else if(value<=m_MinNumStack.top())  //如果入栈的值比当前的最小值还要小
		    m_MinNumStack.push(value);
		
		m_BasicStack.push(value); 
	} 
	
	int pop()
	{
		if(m_MinNumStack.empty())
		{
			//不可出栈
			cout<<"您操作的栈为空"<<endl;
			return Error; 
		}
		
		int temp=m_BasicStack.top();
		m_BasicStack.pop();
		if(temp==m_MinNumStack.top())
		    m_MinNumStack.pop();
		
		return temp;  
	}
	
	int getMin()
	{
		if(m_MinNumStack.empty())
		{
			//不可出栈
			cout<<"您操作的栈为空"<<endl;
			return Error;  
		}
		return m_MinNumStack.top();
	}
};

int main()
{
	GetMinStack test;
	test.push(5);
	test.push(8);
	test.push(4);
	test.push(10);
	
	cout<<"该栈最小的数为:"<<test.getMin()<<endl; 
}
  • 运行截图

以上是关于c++栈 编写一个类实现简单的栈的主要内容,如果未能解决你的问题,请参考以下文章

首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)

用java编写程序,利用线程同步编写一个栈操作程序,包括数据的进栈和出栈。

16双栈排序

数据结构-栈(C++实现)

1. 用C++或Java写一个关于堆栈的类描述,并为堆栈的压栈(push)和出栈(pop)操作编写方法

设计一个获取最小值时间复杂度为O的栈