数据结构(四)栈和列队

提示:本文仅做简单介绍,部分图来自网络,侵删


一、栈

stack:限定在表尾进行插入和删除操作的线性表,这种结构又称为先进后出的线性表,表尾称栈顶,表头称栈底,不含任何元素称空栈
栈的基本操作

InitStack();		// 初始化
DestoryStack();		// 销毁
ClearStack();		// 清空栈
StackEmpty();		// 判断栈是否为空
StackLength();		// 栈的长度
GetTop();			// 返回栈顶元素
Push();				// 元素入栈
Pop();				// 元素出栈
StackTraverse(S, visit());	// 对栈中每个元素调用visit(),visit()失则操作失败 

栈的表示

struct Stack{
	ElemType *base;		//	指向栈底
	ElemType *top;		// 指向栈顶
	int StackSize;		// 栈的大小
}

二、栈的应用

非负十进制转八进制

void conversation(unsigned int &N) {
	stack<unsigned int> S;
	while(N) {
		S.push(N % 8);
		N /= 8;
	}
	while(!S.empty()) {
		S.pop();
	}
}

leecode 20 有效括号

class Solution {
public:
    bool isValid(string s) {

        stack<char> stk;
        for(char ch:s) {
            if(ch == '(') {
                stk.push(')');
            }
            else if(ch == '[') {
                stk.push(']');
            }
            else if(ch == '{') {
                stk.push('}');
            }
            else{
                if(stk.empty() || stk.top() != ch) {
                    return false;
                }
                else {
                    stk.pop();
                }
            }
        }
        return stk.empty();
    }
};

三、栈与递归

Fibonacci 数列

class Solution {
public:
    int fib(int n) {
        if(0 == n) return 0;
        if(1 == n) return 1;
        return fib(n - 1) + fib(n - 2);
    }
};

nHanoi

void hanoi(int n, char x, char y, char z) {	
	// x --> z
	if(n == 1) {
		move(1, x, z);	// 将编号1的圆盘从x移动到z
	}
	else {
		hanoi(n - 1, x, z, y);		// 将1~(n-1) 个圆盘从x移动到y, z辅助
		move(n, x, z);				// 将编号n的圆盘从x移动到z
		hanoi(n - 1, y, x, z);		// 将1~(n-1) 个圆盘从y移动到z, x辅助
	}
}

四、队列

队列queue:一种先进先出的线性表,只允许在表的一端插入,在另一端删除。

基本操作

InitQueue();		// 初始化一个队列
DestoryQueue();		// 销毁一个队列
CLearQueue();		// 清空队列
QueueEmpty();		// 判断队列是否为空
QueueLength();		// 返回队列长度
GetHead();			// 返回队头
EnQueue();			// 队尾插入
DeQueue();			// 删除队头
QueueTraverse(Q, visit());		// 对队列中每个元素调用visit(),visit()失则操作失败 

链队列

循环队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值