29.棧的 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 序列。
思路:首先,我記錄了每個pop序列中每乙個元素對應在push序列中的位置。這就像是把push序列強製成0 1 2 3 4...一樣,這樣push序列就是從小到大排列的了。
然後,觀察從小到大排列的push序列,其合理的pop序列的特點。
4 5 3 2 1
記錄第1個數字 並查詢遞增的數字 這裡是 4 5 他們是遞增的。
3 4 2 1 5
3 4 5 遞增的
發現只要這些數字符合遞增規律,那麼pop序列就是合理的。且這些序列就是新加入數字後開始彈出的值。
還是拿3 4 2 1 5舉例
3 是在壓入1 2 3後彈出的第乙個值
4 是在壓入4後彈出的第乙個值
5 是在壓入5後彈出的第乙個值
4 2 1這個遞減的序列表示,沒有壓入新值,一直在彈出。
即,有遞增序列表示有壓入新的值,遞減序列表示一直彈出。因為push序列時遞增的,故壓入的新值只能越來越大。
對於4、3、5、1、2
4 5 2 顯然不滿足遞增關係 即壓入5後不能再壓入2 不是合法的pop序列
注:我沒法證明,不知道是不是所有的都符合這個規律。誰能舉出反例嗎?
/*29.棧的 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 序列。
start time = 16:15
end time = 17:20
*/#include
int * getlocation(int data, int * poplist, int
len)
return
null;
}bool ispop(int * pushlist, int * poplist, int
len)
else
}int increasenum2 = poplist[0
];
intincreasenum1;
for(int i = 1; i < len; i++)
}return
true;}
intmain()
;
int b[5] = ;
bool
is = ispop(a, b, 5
);
return0;
}
網上答案:網上的思路驚人的一致,都是直接的建乙個棧來模擬這個過程。比我的思路來的要好,計算少,又好理解。
如果我們希望pop的數字正好是棧頂數字,直接pop出棧即可;如果希望pop的數字目前不在棧頂,我們就到push序列中還沒有
* 被push到棧裡的數字中去搜尋這個數字,並把在它之前的所有數字都push進棧。如果所有的數字都被push進棧仍然沒有找到這
* 個數字,表明該序列不可能是乙個pop序列。
網上隨便找了個**,還沒驗證
//棧的push、pop序列
#include
#include
const
int size=5; //
定義長度
using
namespace
std;
bool judge(int spush,int
spop)
ipush++;
}if(ipop==size) return
true
;
else
return
false;}
int main(void
)
棧的push pop序列
棧的push pop序列 輸入兩個整數序列。其中乙個序列表示棧的push 順序,判斷另乙個序列有沒有可能是對應的 pop順序。為了簡單起見,我們假設 push 序列的任意兩個整數都是不相等的。比如輸入的push 序列是1 2 3 4 5,那麼4 5 3 2 1就有可能是乙個 pop系列。因為可以有如...
棧的push pop序列
題目 輸入兩個整數序列。其中乙個序列表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。比如輸入的push序列是1 2 3 4 5,那麼4 5 3 2 1就有可能是乙個pop系列。因為可以有如下的push和pop序列 pus...
棧的PUSH POP序列
輸入兩個整數序列,其中乙個表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop序列。下面使用乙個棧來模擬這個操作過程,棧頂元素等於出棧序列中的元素時出棧,不等於時入棧。如果棧正常pop直到為空,說明序列是對應的pop序列返回真,否則返回假 1 pst 為已經初始化的棧 2 input為輸入棧...