栈的压入、弹出序列——22

根据给定的压栈顺序判断一个序列是否为合法的弹出顺序。通过遍历两个序列,找到弹出序列的第一个元素在压栈序列的位置,依次检查后续元素是否符合栈的操作逻辑。程序实现并运行得出结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈顺序,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。


    首先,可以在第一个序列也就是压栈顺序中找第二个序列中第一个元素,是4,因为第二个序列中第一个元素是第一个被弹出的,那么在压入顺序中,被弹出数据之前的所有数据都被压入了栈中且还没有被弹出,也就是连续压进去了1、2、3、4,然后弹出第一个数据4;之后在第二个序列中往后的元素,是5,如果不是栈顶元素就在第一个序列中从4开始往后找继续压入再弹出,再次往后取第二个序列中的元素,如果是栈顶元素就弹出,直到栈空且两个序列都遍历一遍为止,否则,如果栈不为空且两个序列都遍历过了,则说明第二个序列不是压栈序列的弹出序列。


程序设计如下:

#include <iostream>#include <stack>#include <assert.h>using namespace std;bool IsPopSeq(int *push_arr, int *pop_arr, size_t size){    assert(push_arr && pop_arr && size);//判断参数的有效性    stack<int> s;    size_t push_index = 0;    size_t pop_index = 0;    while(pop_index < size)    {    //将输入队列中处于输出队列第一个元素之前的所有元素都压入栈内           while(push_index < size)        {            s.push(push_arr[push_index]);            ++push_index;            if(s.top() == pop_arr[pop_index])                break;        }        //判断,如果输入队列全部压完了但仍然没有找到输出队列的的第一个元素,就返回false        if((!s.empty()) && (s.top() != pop_arr[pop_index]))             return false;        //当栈中的元素恰好就是输出队列的弹出顺序时就不断的弹出        while((!s.empty()) && (pop_arr[pop_index] == s.top()))        {            s.pop();            ++pop_index;        }    }       //正确返回的条件就是当输入队列和输出队列都遍历完毕且栈为空时判断完成    if((push_index == size) && (pop_index == size) && s.empty())        return true;    else        return false;}int main(){    int push_arr[] = {1, 2, 3, 4, 5};    int pop_arr1[] = {4, 5, 3, 2, 1};    int pop_arr2[] = {4, 3, 5, 1, 2};    int pop_arr3[] = {2, 5, 3, 4, 1};    size_t size = sizeof(push_arr)/sizeof(push_arr[0]);    bool ret = IsPopSeq(push_arr, pop_arr1, size);    cout<<ret<<endl;    ret = IsPopSeq(push_arr, pop_arr2, size);    cout<<ret<<endl;    ret = IsPopSeq(push_arr, pop_arr3, size);    cout<<ret<<endl;    return 0;}


运行程序:

wKioL1dAJbWjA7OiAAAEoRPX0Ns823.png

从上面的数组可以判断结果分别为true,false,false。



《完》

本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1775709

### LinkedList 的 Push 和 Pop 实现原理 在 `LinkedList` 数据结构中,Push 和 Pop 是两种常见的操作方式。以下是它们的具体定义以及实现细节。 #### 推 (Push) 操作 对于链表而言,“推”通常指的是向列表的一端(通常是头部或尾部)插一个新的节点。由于 `LinkedList` 支持双向链接特性,因此可以在任意一端执行此操作。 - **头插法**: 将新节点放置到链表的最前端。 - **尾插法**: 将新节点追加到链表的最后一端。 具体来说,在 Java 中可以通过以下方法完成这些功能: ```java // 向链表尾部添加元素 void addLast(E e); // 或者使用更通用的方法 boolean add(E e); // 向链表头部添加元素 void addFirst(E e); ``` 这里需要注意的是,`add()` 方法默认会将元素添加至链表末尾[^1]。 #### 弹出 (Pop) 操作 “弹出”是指移除并返回位于指定位置上的某个节点值的操作。“Pop”的行为取决于上下文中所指代的方向——即是从队列视角还是视角来理解该动作。 - 如果按照的方式看待,则意味着删除最近被加的那个项目(也就是最后面那个),这对应于调用removeLast()函数; - 而如果是基于先进先出(FIFO)原则下的队列模式下考虑pop的话,则应该采用removeFirst()命令取出最先存进去的数据项[^2]。 下面是关于如何通过Java标准库中的类来进行这两种基本操作的一个简单例子: ```java import java.util.LinkedList; public class Main { public static void main(String[] args){ LinkedList<Integer> ll = new LinkedList<>(); // 添加元素 ll.addFirst(3); // 插到开头 ll.addLast(5); // 追加到最后 System.out.println("Initial List: "+ll); Integer poppedValueHead = ll.removeFirst(); // 移除第一个元素 System.out.println("Popped Head Value: "+poppedValueHead+", Remaining List: "+ll); Integer poppedValueTail = ll.removeLast(); // 移除最后一个元素 System.out.println("Popped Tail Value: "+poppedValueTail+", Final List: "+ll); } } ``` 以上程序展示了怎样利用`LinkedList`去管理一系列整数,并演示了分别从两端取走数值的过程[^1]。 另外值得注意的是,虽然这里的讨论主要围绕着线性序列展开,但实际上还有其他形式更加复杂的非线性数据存储模型比如树形结构等也广泛应用于计算机科学领域之中[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值