数据结构(栈和队列)

题目一:栈的压入和弹出顺序

  • 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
  • 思路:用两个数组来表示两个序列,用两个index来指向各自数组当前的引用,用一个栈来记录压栈的过程,stack 压入数字1, 比较1与另一个序列当前的值即4,发现不等,继续压栈,直到原始序列中4被压入,此时弹出4,另一个序列的index向后移动一位,再继续比较,直到第一个序列指针指向最后一位,而stack也空了,则该序列是压栈序列的弹出序列,如果指针指向了最后一个数字,但是stack里任然有值,则不是。

        static bool IsPopOrder(int[] order, int[] popOrder)
            {
                Stack<int> stack = new Stack<int>();
                int currentOrderIndex = 0;     // 原始序列当前指针
                int currentPopOrderIndex = 0;  //待检验序列当前指针
    
                if (order == null || popOrder == null || order.Length != popOrder.Length || order.Length == 0)
                {
                    return false; //鲁棒性考虑
                }
                if (order.Length == 1 && order[0] == popOrder[0])
                {
                    return true;//如果各自序列都只有一个值,而且相等,则OK
                }
                stack.Push(order[currentOrderIndex]); //将原始序列第一个值压栈
                currentOrderIndex++; //指针指向后一位。
                while (currentOrderIndex <= order.Length) //原始序列的当前指针没有指向最后则一直循环                   //加等号是为了让循环继续,因为最后被加入stack里的值,还没有机会pop出来
                {
                    while (stack.Count > 0 && stack.Peek() == popOrder[currentPopOrderIndex])//如果栈顶的数字和待检验的序列当前数字相等
                    {
                        stack.Pop();//弹出
                        currentPopOrderIndex++;//待检验序列当前指针向后移。
                    }
                    //如果不相等,则
                    if (currentOrderIndex < order.Length)
                    {
                        stack.Push(order[currentOrderIndex]);//原始序列压栈
                    }
                    currentOrderIndex++; //原始序列指针向后移动
                }
                if (stack.Count == 0)
                {
                    return true;
                }
                return false;
            }
时间: 2024-11-25 12:41:36

数据结构(栈和队列)的相关文章

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

C#数据结构—栈和队列

一:栈 栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制.栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以,把栈和队列称为操作受限的线性表. 1:栈的定义及基本运算 栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom).当栈中没有数据元素时叫

c数据结构 -- 栈与队列

栈和队列 ·栈和队列是两种常用的.重要的数据结构 ·栈和队列是限定插入和删除只能在表的“端点”进行的线性表 栈 只能在队尾插入,只能在队尾删除 -- 后进后出 表尾称为栈顶:表头称为栈底 插入元素到栈顶(即表尾)的操作,称为入栈 从栈顶删除最后一个元素的操作,称为出栈 注意:函数调用的流程就是入栈和出栈的实现,遵循后调用的先返回 队列 只能在队尾插入,只能在对队头删除 -- 先进先出 顺序栈的实现: #include <stdio.h> #include <stdlib.h> #d

数据结构-栈、队列和链表

一.栈stack 是后进先出的数据结构 栈顶指针指的始终是栈最上方元素的一个标记,即放在最上面的元素.栈顶元素为空时令top为-1. 在使用pop()函数和top()函数时,需要使用empty()判断栈是否为空. 在STL中stack容器来编写代码,STL定义stack的复杂度是O(1). 常见函数: clear() size() empty() push() pop() top() 二.队列queue 是一种先进先出的数据结构 需要一个队首指针front来指向队首元素的前一个位置,而使用一个队

数据结构-栈和队列

栈和队列都是线性表,所以满足-只有一个节点没有前继,只有后继,只有一个节点只有后继没有前继,其他的节点只有一个前继只有一个后继. 栈的定义是先进后出,最典型的例子就是弹夹,最先进去的反而是最后射出来的,在实际的软件开发中会进经常的遇到这种类型的线性表,我们成为LIFO(Last in First out).可以把栈想象成是只有一个出口的容器,最先放进去的东西只能够等其上面的东西呗拿走之后才能够拿出来. 队列则是另外的一种线性表,队列在我们生活中就更常见了,比如排队啊什么的,队列讲的是先进先出,在

数据结构-栈与队列

相比于数组这种存储数据的数据,栈(Stock)和队列(Queue)主要作用是在程序中作为构思算法的辅助工具,是一种程序员开发过程中的便利工具.Stock和Queue具有访问受限以及更加抽象的特征. 一.栈 栈只允许访问最后一个插入的元素,即栈是先进后出(FILO)的一种数据结构.栈主要提供的算法包括push,pop和peek.其中push是插入一个元素,pop是弹出最近添加的一个元素,peek是返回最近添加的一个元素. 栈的底层实现可以是数组,也可以是链表,这里采用数组实现一个栈,代码如下: 1

JavaScript数据结构——栈和队列

栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 ------------------------------------------------------------------------------------------------------ 栈方法声明: 首先,采用数组来保存栈里的元素. 序号 方法 说明 1 push ( element(s) ) 添加一个(或几个)新元素到栈顶 2 pop ( ) 移除栈顶的元素,同时返回被移除的元素 3 peek ( )

数据结构——栈与队列

题目: 1.编写函数,采用链式存储实现栈的初始化.入栈.出栈操作 2.编写函数,采用顺序存储实现栈的初始化.入栈.出栈操作 3.编写函数,采用链式存储实现队列的初始化.入队.出队操作 4.编写函数,采用顺序存储实现队列的初始化.入队.出队操作 5.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法 题目分析: 1.顺序栈的类型定义 #define MAX 100  //栈的最大值 typedef struct {     ElemType *base;     int top; } 

考研数据结构-栈和队列

栈 栈是一种只能在一端进行插入或删除操作的线性表. 线性表:栈的逻辑结构属于线性表,只不过在操作上加了一些约束. 一端:可以插入或者删除元素的一端叫栈顶,另一端叫栈底. 顺序栈 1 int stack[maxSize]; 2 int top = -1; 3 4 //元素入栈 5 stack[++top] = x; 6 7 //元素出栈 8 x = stack[top--]; 链栈 1 LNode *head = (LNode*)malloc(sizeof(LNode)); 2 head→next