zoukankan      html  css  js  c++  java
  • C++学习---栈的构建及操作

    一、顺序栈

      

    #include <iostream>
    using namespace std;
    #define MAXSIZE 100 //栈的最大容量
    typedef struct {
        int* base;//栈底指针
        int* top;//栈顶指针
        int stacksize;//栈可用的最大容量
    }SqStack;
    
    void InitStack(SqStack& S) {
        //构造空栈
        S.base = new int[MAXSIZE];
        if (!S.base) exit(OVERFLOW);//存储分配失败
        S.top = S.base;//top初始为base表示为空栈
        S.stacksize = MAXSIZE;
    }
    
    //入栈  
    bool Push(SqStack& S, int e) {
        //插入元素e为新的栈顶元素
        if (S.top - S.base == S.stacksize) return false;//栈满
        *S.top++ = e;//元素e压入栈顶,栈顶指针加1
        return true;
    }
    //出栈
    bool Pop(SqStack& S, int& e) {
        //删除S的栈顶元素,用e返回其值
        if (S.top == S.base) return false;//top=base表示为空栈,返回NULL
    	e=*(--S.top);//栈顶指针减1,将栈顶元素赋值给e
        return true;
    }
    //取栈顶元素,返回S的栈顶元素,不修改栈顶指针
    int GetTop(SqStack S) {
        if (S.top != S.base) return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
    	return NULL;
    }
    //判断顺序栈S是否为空栈
    bool isEmpty(SqStack S) {
    	if (S.top!=S.base) return false;//不为空返回fasle
    	return true;//为空返回true
    }
    //批量入栈
    void StackInput(SqStack& S) {
    	int value;
    	cout << "请输入入几次栈:";
    	cin >> S.stacksize;//用户输入入几次栈
    	for (int i = 0; i < S.stacksize; i++) {
    		cout << "请输入第" << i + 1 << "个值:";
    		cin >> value;
    		if (Push(S, value)) cout << "入栈成功!"<<endl;
    		else cout << "入栈失败!";
    	}
    }
    //依次弹出栈顶元素
    void StackOut(SqStack& S) {
    	int value;
    	cout << "依次弹出的栈顶元素为:
    ";
    	while (Pop(S,value))
    	{
    		cout << value << "	";
    	}
    }
        
    int main()
    {
    	int opearateNum = 0;//操作值
    	SqStack S;
    	InitStack(S);//初始化堆栈
    
    	while (true)
    	{
    		cout << "1、批量入栈	2、全部出栈	3、读栈顶元素	4、弹出栈顶元素	5、退出" << endl;
    		cin >> opearateNum;
    		if (opearateNum == 5)
    			break;
    		switch (opearateNum)
    		{
    		case 1:
    			//入栈
    			StackInput(S);
    			system("pause");
    			system("cls");
    			break;
    		case 2:
    			//依次出栈
    			StackOut(S);
    			system("pause");
    			system("cls");
    			break;
    		case 3:
    			//读栈顶元素
    			if (!isEmpty(S))cout << GetTop(S) << endl;
    			else cout << "堆栈无元素!" << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 4:
    			//弹出栈顶元素
    			int value;//弹出的值
    			if (!Pop(S, value)) cout << "堆栈无元素" << endl;
    			else cout << "弹出的栈顶元素的值为:" << value << endl;
    			system("pause");
    			system("cls");
    			break;
    		default:
    			cout << "无效操作,请重新输入!" << endl;
    			break;
    		}
    	}
    }
    

      二、链栈

    #include <iostream>
    using namespace std;
    //链栈的存储结构
    typedef struct StackNode {
        int elem;//栈中的数据元素
        struct StackNode* next;
    }*LinkStack;
    //链栈的初始化
    void InitStack(LinkStack& S) {
        S = NULL;//构造一个空栈S
    }
    //入栈,在栈顶插入元素e
    bool Push(LinkStack &S,int e) {
        StackNode *p = new StackNode;//生成新结点
        p->elem = e;//将新结点p的数据域设置为e
        p->next = S;//将新结点插入栈顶
        S = p;//修改栈顶指针为p
        return true;
    }
    //出栈,删除S的栈顶元素,用第二个参数返回其值
    bool Pop(LinkStack& S, int& e) {
        if (S == NULL) return false;//栈空  返回false
        e = S->elem;//将栈顶元素值赋给e
        StackNode* p = S;//用p临时保存栈顶元素空间,以备释放
        S = S->next;//修改栈顶指针
        delete p;//释放原来的栈顶内存空间
        return true;
    }
    //取栈顶元素,不修改栈顶指针
    int GetTop(LinkStack S) {
        if (S != NULL) return S->elem;//如果栈为非空则返回栈顶元素
    }
    //判断链栈S是否为空栈
    bool isEmpty(LinkStack S) {
    	if (S != NULL) return false;//不为空返回fasle
    	return true;//为空返回true
    }
    //批量入栈
    void StackInput(LinkStack& S) {
        int value;
        int PushNum;//入栈数
        cout << "请输入入几次栈:";
        cin >> PushNum;//用户输入入几次栈
        for (int i = 0; i < PushNum; i++) {
            cout << "请输入第" << i + 1 << "个值:";
            cin >> value;
            if (Push(S, value)) cout << "入栈成功!" << endl;
            else cout << "入栈失败!";
        }
    }
    //依次弹出栈顶元素
    void StackOut(LinkStack& S) {
        int value;
        cout << "依次弹出的栈顶元素为:
    ";
        while (Pop(S, value))
        {
            cout << value << "	";
        }
    }
    
    int main()
    {
    	int opearateNum = 0;//操作值
    	LinkStack S;
    	InitStack(S);//初始化堆栈
    
    	while (true)
    	{
    		cout << "1、批量入栈	2、全部出栈	3、读栈顶元素	4、弹出栈顶元素	5、退出" << endl;
    		cin >> opearateNum;
    		if (opearateNum == 5)
    			break;
    		switch (opearateNum)
    		{
    		case 1:
    			//入栈
    			StackInput(S);
    			system("pause");
    			system("cls");
    			break;
    		case 2:
    			//依次出栈
    			StackOut(S);
    			system("pause");
    			system("cls");
    			break;
    		case 3:
    			//读栈顶元素
    			if (!isEmpty(S)) cout << GetTop(S) << endl;
    			else cout << "堆栈为空栈!" << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 4:
    			//弹出栈顶元素
    			int value;//弹出的值
    			if (!Pop(S, value)) cout << "堆栈为空栈!" << endl;
    			else cout << "弹出的栈顶元素的值为:" << value << endl;
    			system("pause");
    			system("cls");
    			break;
    		default:
    			cout << "无效操作,请重新输入!" << endl;
    			break;
    		}
    	}
    }
    

      

  • 相关阅读:
    TH-Union教学机 指令总结
    Manjaro 显卡驱动安装
    grub学习内容
    manjaro 折腾
    链栈的实现
    汇编综合实验
    二叉树
    Oracle表空间基本操作
    Windows7/10实现ICMP(ping命令)
    WireShark——IP协议包分析(Ping分析IP协议包)
  • 原文地址:https://www.cnblogs.com/edllixiaoyu/p/13734162.html
Copyright © 2011-2022 走看看