好文档 - 专业文书写作范文服务资料分享网站

算法大全-面试题-数据结构

天下 分享 时间: 加入收藏 我要投稿 点赞

if (queue1.Count == 0)

queue2.Enqueue(element); else

queue1.Enqueue(element); }

public int Pop() {

if (queue1.Count == 0 && queue2.Count == 0) throw new Exception(\if (queue1.Count > 0) {

while (queue1.Count > 1) {

queue2.Enqueue(queue1.Dequeue()); } //还剩一个

return (int)queue1.Dequeue(); }

else //queue2.Count > 0 {

while (queue2.Count > 1) {

queue1.Enqueue(queue2.Dequeue()); } //还剩一个

return (int)queue2.Dequeue(); } }

public int Peek() {

if (queue1.Count == 0 && queue2.Count == 0) throw new Exception(\int result = 0;

if (queue1.Count > 0) {

while (queue1.Count > 1) {

queue2.Enqueue(queue1.Dequeue()); } //还剩一个

result = (int)queue1.Dequeue(); queue2.Enqueue(result); }

else //queue2.Count > 0

{

while (queue2.Count > 1) {

queue1.Enqueue(queue2.Dequeue()); } //还剩一个

result = (int)queue2.Dequeue(); queue1.Enqueue(result); } return result; } }

5.栈的push、pop序列是否一致

输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。

比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。

网上的若干算法都太复杂了,现提出包氏算法如下: 先for循环把arr1中的元素入栈,并在每次遍历时,检索arr2中可以pop的元素。如果循环结束,而stack中还有元素,就说明arr2序列不是pop序列。 static bool

JudgeSequenceIsPossible(int[] arr1,int[] arr2) {

Stackstack =newStack();

for(inti = 0, j = 0; i < arr1.Length; i++) {

stack.Push(arr1[i]);

while(stack.Count > 0 && (int)stack.Peek() == arr2[j]) {

stack.Pop(); j++; } }

returnstack.Count == 0;

}

6.递归反转一个栈,要求不得重新申请一个同样的栈,空间复杂度o(1)

算法思想:汉诺塔的思想,非常复杂,玩过九连环的人都想得通的 static void ReverseStack(ref Stack stack) {

if (stack.Count == 0) return;

object top = stack.Pop(); ReverseStack(ref stack); if (stack.Count == 0) {

stack.Push(top); return; }

object top2 = stack.Pop(); ReverseStack(ref stack); stack.Push(top);

ReverseStack(ref stack); stack.Push(top2); }

7.给栈排个序

本题目是上一题目的延伸 static void Sort(ref Stack stack) {

if (stack.Count == 0) return;

object top = stack.Pop(); Sort(ref stack);

if (stack.Count == 0) {

stack.Push(top);

return; }

object top2 = stack.Pop(); if ((int)top > (int)top2) {

stack.Push(top); Sort(ref stack); stack.Push(top2); } else {

stack.Push(top2); Sort(ref stack); stack.Push(top); } }

8..如何用一个数组实现两个栈

继续我所提倡的抠门儿思想,也不枉我和青菜脸相交一场。 网上流传着两种方法: 方法1

采用交叉索引的方法

一号栈所占数组索引为0, 2, 4, 6, 8......(K*2)

二号栈所占数组索引为1,3,5,7,9 ......(K*2 + 1)

算法实现如下:

public class NewStack {

object[] arr; int top1; int top2;

public NewStack(int capticy) {

arr = new object[capticy]; top1 = -1;

top2 = -2;

}

public void Push(int type, object element) {

if (type == 1) {

if (top1 + 2 >= arr.Length)

throw new Exception(\ else {

top1 += 2;

arr[top1] = element; } } else //type==2 {

if (top2 + 2 >= arr.Length)

throw new Exception(\ else {

top2 += 2;

arr[top2] = element; } } }

public object Pop(int type) {

object obj = null; if (type == 1) {

if (top1 == -1)

throw new Exception(\ else {

obj = arr[top1]; arr[top1] = null; top1 -= 2; } } else //type == 2 {

if (top2 == -2)

throw new Exception(\ else {

算法大全-面试题-数据结构

if(queue1.Count==0)queue2.Enqueue(element);elsequeue1.Enqueue(element);}publicintPop(){if(queue1.Cou
推荐度:
点击下载文档文档为doc格式
17g0x8arf2570pk9t1s5
领取福利

微信扫码领取福利

微信扫码分享