C++ 数据结构与算法----栈的功能实现

1、栈定义

 栈(stack)是限定仅在表的一端进行插入、删除操作的线性表,允许插入和删除的一端称为栈顶(Top),表的另一端被称为栈底(Bottom)。当栈中没有元素时称为空栈。栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。

2、栈的特性

先进后出

 

3、栈的结构及实现

3.1顺序栈

 栈作为一种特殊的线性表,在计算机中主要有两种基本的存储结构:顺序存储结构链式存储结构。我们称顺序存储的栈为顺序栈,链式存储的栈为链栈

  顺序栈是顺序存储结构实现的栈,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。通常以top=-1表示空栈,top=maxsize-1为满栈。(maxsize表示最大长度)

顺序栈的存储结构的进栈和出栈过程如下图:

 3.1.2顺序栈的实现

(1)构造函数

SeqStack::SeqStack()
{
    top=-1;
    RSize=maxSize;
    Sstack=new T[RSize];
    if(Sstack==NULL)
    {
    	cout<<"分配内存失败,退出";
    	exit(1);
    }
}

(2)析构函数

SeqStack::~SeqStack()
{
	if(Sstack!=NULL)
    	delete[] Sstack;
}

(3)入栈操作

void SeqStack::push(T x)
{ 
    if(isFull()) 
        overflow();
    Sstack[++top]=x;
}

(4)出栈操作

bool SeqStack::pop(T& x)
{ 
    if(isEmpty())
        return false;
    x=Sstack[top--];
    return true;
}

(5)获栈顶操作

bool SeqStack::getTop(T& x)
{ 
    if(isEmpty())
        return false;
    x=Sstack[top];
    return true;
}

(6)判空操作

bool SeqStack::isEmpty()
{
    return (top==-1)?true:false;
}

(7)判满操作

bool SeqStack::isFull()
{
    return (top==RSize-1)?true:false;
}

(8)计算元素个数操作

int SeqStack::getSize()
{
    return top+1;
}

(9)置栈空操作

void SeqStack::makeEmpty()
{ 
    top=-1;
}

(10)由栈顶到栈底依次输出元素

void SeqStack::print()
{
	cout<<"栈顶到栈底元素依次为:"<<endl;
	for(int i=top;i>=0;i--)
		cout<<Sstack[i]<<" ";
	cout<<endl;
}

void menu(){
    cout<<"1.进栈"<<endl;
    cout<<"2.出栈"<<endl;
    cout<<"3.获取栈顶元素"<<endl;
    cout<<"4.栈置空"<<endl;
    cout<<"5.由栈顶到栈底依次输出栈元素"<<endl;
    cout<<"6.退出"<<endl;
} 

void function(int num,SeqStack *ss){
    switch(num){
        int x;
        case 1:
        	cout<<"请输入进栈元素值,多个值以空格分隔,-1为结束标志:"<<endl;
            cin>>x;
            while(x!=-1){
            	ss->push(x);
            	cin>>x;
            }
            cout<<endl;
            break;
        case 2:
            cout<<"出栈栈顶元素:"<<endl;
            ss->pop(x);
            cout<<x<<endl;
            cout<<"栈内元素有:"<<endl;
            ss->print();
            break;
        case 3:
            cout<<"栈顶元素为:"<<endl;
            ss->getTop(x);
            cout<<x<<endl; 
            cout<<endl;
            break;
        case 4:
            ss->makeEmpty();
            cout<<"栈已置空"<<endl;
            cout<<endl;
            break; 
        case 5:
        	ss->print();
            cout<<endl;
        	break;
        default:
            exit(0);
    }
}

int main(int argc, char** argv) 
{
	cout<<"学号+姓名第4周顺序栈:"<<endl;
    SeqStack *ss=new SeqStack;
    int num;
    while(true){
        menu();
        cin>>num;
        function(num,ss);
    } 
    delete ss;
    return 0; 
}

 顺序栈的功能实现

#include <iostream>
using namespace std;
#define maxSize 50
typedef int T;
//顺序栈
class SeqStack{
	private:
        T *Sstack;//栈使用内存首地址
        int top;//栈顶指针
        int RSize;//栈分配元素个数
        void overflow();
    public:
        SeqStack();
        ~SeqStack();
        void push(T x);
        bool pop(T& x);
        bool getTop(T& x);
        bool isEmpty();
        bool isFull();
        int getSize();
        void makeEmpty();
        void print();
};


//构造
SeqStack::SeqStack()
{
    top=-1;
    RSize=maxSize;
    Sstack=new T[RSize];
    if(Sstack==NULL)
    {
    	cout<<"分配内存失败,退出";
    	exit(1);
    }
}
//析构
SeqStack::~SeqStack()
{
	if(Sstack!=NULL)
    	delete[] Sstack;
}
//栈溢出时扩大栈容量
void SeqStack::overflow()
{
	if(Sstack!=NULL)
	{
	    T *newArray=new T[RSize+20];
	    if(newArray!=NULL)
	    {
		    for(int i=0;i<=top;i++)
		    {
		        newArray[i]=Sstack[i];
		    }
		    RSize+=20;
		    delete []Sstack;
		    Sstack=newArray;
	    }
	}
}
//进栈
void SeqStack::push(T x)
{ 
    if(isFull()) 
        overflow();
    Sstack[++top]=x;
}
//出栈
bool SeqStack::pop(T& x)
{ 
    if(isEmpty())
        return false;
    x=Sstack[top--];
    return true;
}
//获取栈顶元素
bool SeqStack::getTop(T& x)
{ 
    if(isEmpty())
        return false;
    x=Sstack[top];
    return true;
}
//栈是否空
bool SeqStack::isEmpty()
{
    return (top==-1)?true:false;
}
//栈是否满
bool SeqStack::isFull()
{
    return (top==RSize-1)?true:false;
}
//栈实际元素个数
int SeqStack::getSize()
{
    return top+1;
}
//置栈空
void SeqStack::makeEmpty()
{ 
    top=-1;
}
//由栈顶到栈底依次输出栈元素
void SeqStack::print()
{
	cout<<"栈顶到栈底元素依次为:"<<endl;
	for(int i=top;i>=0;i--)
		cout<<Sstack[i]<<" ";
	cout<<endl;
}

void menu(){
    cout<<"1.进栈"<<endl;
    cout<<"2.出栈"<<endl;
    cout<<"3.获取栈顶元素"<<endl;
    cout<<"4.栈置空"<<endl;
    cout<<"5.由栈顶到栈底依次输出栈元素"<<endl;
    cout<<"6.退出"<<endl;
} 

void function(int num,SeqStack *ss){
    switch(num){
        int x;
        case 1:
        	cout<<"请输入进栈元素值,多个值以空格分隔,-1为结束标志:"<<endl;
            cin>>x;
            while(x!=-1){
            	ss->push(x);
            	cin>>x;
            }
            cout<<endl;
            break;
        case 2:
            cout<<"出栈栈顶元素:"<<endl;
            ss->pop(x);
            cout<<x<<endl;
            cout<<"栈内元素有:"<<endl;
            ss->print();
            break;
        case 3:
            cout<<"栈顶元素为:"<<endl;
            ss->getTop(x);
            cout<<x<<endl; 
            cout<<endl;
            break;
        case 4:
            ss->makeEmpty();
            cout<<"栈已置空"<<endl;
            cout<<endl;
            break; 
        case 5:
        	ss->print();
            cout<<endl;
        	break;
        default:
            exit(0);
    }
}

int main(int argc, char** argv) 
{
	cout<<"学号+姓名第4周顺序栈:"<<endl;
    SeqStack *ss=new SeqStack;
    int num;
    while(true){
        menu();
        cin>>num;
        function(num,ss);
    } 
    delete ss;
    return 0; 
}


版权声明:本文为Danlinglili原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。