public int MaxSub(int[] nums) { SimpleStack <int> stack = new SimpleStack <int> (); var lastMax = int.MinValue; for (int i = 0; i < nums.Length; i++) { if (nums [i] < 0) { if (lastMax <= nums [i]) { lastMax = nums [i]; } if (!stack.Empty()) { var last = stack.Pop(); lastMax = Math.Max(lastMax, last); last += nums [i]; if (last > 0) { stack.Push(last); } } } else if (nums [i] > 0) { if (stack.Empty()) { stack.Push(nums [i]); } else { var last = stack.Pop(); last += nums [i]; stack.Push(last); } } else { lastMax = Math.Max(nums [i], lastMax); } } if (!stack.Empty()) { var f = stack.Pop(); lastMax = Math.Max(lastMax, f); } return(lastMax); }
public IList <int> PreorderTraversal(TreeNode root) { SimpleStack <TreeNode> stack = new SimpleStack <TreeNode> (); IList <int> result = new List <int> (); if (root != null) { stack.Push(root); while (!stack.Empty()) { var node = stack.Pop(); result.Add(node.val); if (node.right != null) { stack.Push(node.right); } if (node.left != null) { stack.Push(node.left); } } } return(result); }
public void NextPermutation(int[] nums) { if (nums != null && nums.Length > 1) { var stack = new SimpleStack <Tuple <int, int> >(); stack.Push(new Tuple <int, int>(nums[nums.Length - 1], nums.Length - 1)); int start = 0; for (int i = nums.Length - 2; i >= 0; i--) { Tuple <int, int> replace = null; while (!stack.Empty() && stack.Top().Item1 > nums[i]) { replace = stack.Pop(); } if (replace != null) { Swap(nums, i, replace.Item2); start = i + 1; break; } else { if (nums[i] > stack.Top().Item1) { stack.Push(new Tuple <int, int>(nums[i], i)); } } } for (int i = 0; i <= (nums.Length - 1 - start) / 2; i++) { Swap(nums, start + i, nums.Length - 1 - i); } } }
public int[] FindOrder(int numCourses, int[,] prerequisites) { List <int>[] adj = new List <int> [numCourses]; for (int r = 0; r < prerequisites.GetLength(0); r++) { if (adj [prerequisites [r, 1]] == null) { adj [prerequisites [r, 1]] = new List <int> (); } adj [prerequisites [r, 1]].Add(prerequisites [r, 0]); } var stack = new SimpleStack <int> (); bool[] visited = new bool[numCourses]; int i = 0; for (; i < numCourses; i++) { if (!visited [i]) { DFS(i, adj, stack, visited); } } var result = new int[numCourses]; i = 0; while (!stack.Empty()) { result [i++] = stack.Pop(); } return(result); }
public IList <int> InorderTraversal(TreeNode root) { var stack = new SimpleStack <TreeNode> (); var result = new List <int> (); if (root != null) { Push(root, stack); while (!stack.Empty()) { var n = stack.Pop(); result.Add(n.val); if (n.right != null) { Push(n.right, stack); } } } return(result); }
/** @return whether we have a next smallest number */ public bool HasNext() { return(!stack.Empty()); }
public int Calculate2(string input) { input = input.Replace(" ", ""); for (int i = 0; i <= input.Length; i++) { if (i == input.Length || input [i] == '+' || input [i] == '-' || input [i] == '*' || input[i] == '/') { if (!stack.Empty() && (i == input.Length || input[i] == '*' || input[i] == '/') && (stack.Top() == '*' || stack.Top() == '/')) { char op = stack.Pop(); int val2 = result.Pop(); int val1 = result.Pop(); switch (op) { case '*': result.Push(val1 * val2); break; case '/': result.Push(val1 / val2); break; } } while (!stack.Empty() && (i == input.Length || input[i] == '+' || input[i] == '-')) { char op = stack.Pop(); int val2 = result.Pop(); int val1 = result.Pop(); switch (op) { case '+': result.Push(val1 + val2); break; case '-': result.Push(val1 - val2); break; case '*': result.Push(val1 * val2); break; case '/': result.Push(val1 / val2); break; } } if (i < input.Length) { stack.Push(input [i]); } } else { result.Push(ReadInteger(input, i, out i)); } } return(result.Pop()); }