【无标题】

 

1441. 用栈操作构建数组

难度中等

101

给你一个数组 target 和一个整数 n。每次迭代,需要从  list = { 1 , 2 , 3 ..., n } 中依次读取一个数字。

请使用下述操作来构建目标数组 target :

  • "Push":从 

list 中读取一个新元素, 并将其推入数组中。

  • "Pop":删除数组中的最后一个元素。
  • 如果目标数组构建完成,就停止读取更多元素。

题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。

请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。

示例 1:

输入:target = [1,3], n = 3

输出:["Push","Push","Pop","Push"]

解释:

读取 1 并自动推入数组 -> [1]

读取 2 并自动推入数组,然后删除它 -> [1]

读取 3 并自动推入数组 -> [1,3]

示例 2:

输入:target = [1,2,3], n = 3

输出:["Push","Push","Push"]

示例 3:

输入:target = [1,2], n = 4

输出:["Push","Push"]

解释:只需要读取前 2 个数字就可以停止。

来源:力扣(LeetCode)

一开始看了很久才明白题意,它是确保数组中的元素是单调递增的,同时入数组的数是从1到n进行一个栈的方式存储。想明白后依照题意,就只需判断当前n和当前数组的一个大小,然后存储push或者pop即可。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** buildArray(int* target, int targetSize, int n, int* returnSize)
{
char **ch=(char **)malloc(sizeof(char *)*2*n);

int num=1,count=0;

for(int i=1,k=0;i<=n&&k<targetSize;i++)
    {
    ch[count]=(char *)malloc(8);

    if(target[k]==i)
       {
          strcpy(ch[count++],"Push");
          num++;
          k++;
       }
    else
      { 
      ch[count]=(char *)malloc(8);
        strcpy(ch[count++],"Push");

        ch[count]=(char *)malloc(8);
        strcpy(ch[count++],"Pop");
        
      }

    }

    *returnSize=count;
    
 return ch;
}

剑指 Offer 31. 栈的压入、弹出序列

难度中等

440

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

示例 1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]

输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4), pop() -> 4,push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

这道题比较简单,只需要将前数组进行入栈,然后判断后数组与栈中元素是否相同进行一个出栈即可;

bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize)
{
int s[pushedSize],top=0,pop=0;

for(int i=0;i<pushedSize;i++)
    {
     s[top++]=pushed[i];
     
     while(top>0&&popped[pop]==s[top-1]&&pop<poppedSize)
        top--;
        pop++;
    }
    
    return (top==0);
}

今天对项目进行了一个框架整理:

打算写一个超市物品管理系统,并用线索化二叉树来进行存储数据

列了一个大纲,对各个子函数进行分布实现并补充;

看了csdn上的项目,感觉还是对其实现有点模糊有点模糊,害得在进行梳理。

//定义物品结构体,包含编号、名称、进货时间、货架位置等信息。

struct Goods

{

int id;

char name[20];

char purchaseTime[20];

char shelf[10];

};

//定义节点结构体,包含指向左右子树的指针、节点数据、以及是否为线索的标记。

struct Node

{

struct Node* left;

struct Node* right;

struct Goods data;

int leftTag;

int rightTag;

};

struct Node* root = NULL; //根节点指针

void createTree(); //创建二叉树

void xiansuohua_tree(struct Node* p); //线索化二叉树

struct Node* findNode(int id); //按编号查找节点

struct Node* inOrderSearch(char name[]); // 按名称查找节点

void insert_Node(); //插入新节点

void delete_Node(); //删除节点

void add_huowu(); //添加货架

void delete_huowu(); //删除货架

void change_sheft(); //修改货架

void show_huowu(); //显示所有货架

void purchase_huowu(); //进货

void sell_huowu(); //出货

void print_caidan(); //打印主菜单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值