2011-02-02 28 views
5

के लिए लिफो (स्टैक) एल्गोरिदम/कक्षा एक्सेल के लिए वीबीए में "स्टैक" कक्षा को लागू करने के लिए देख रहा हूं। मैं लास्ट इन फर्स्ट आउट स्ट्रक्चर का उपयोग करना चाहता हूं। क्या कोई इस समस्या से पहले आया था? आप इस तरह के ढेर, Hastable, वेक्टर के रूप में संरचना से निपटने बाहरी पुस्तकालयों ... (अलग मूल Excel संग्रह आदि ...)एक्सेल वीबीए

धन्यवाद

उत्तर

7

यहाँ एक बहुत ही सरल ढेर वर्ग है।

Option Explicit 
Dim pStack As Collection 
Public Function Pop() As Variant 
    With pStack 
     If .Count > 0 Then 
      Pop = .Item(.Count) 
      .Remove .Count 
     End If 
    End With 
End Function 
Public Function Push(newItem As Variant) As Variant 
    With pStack 
     .Add newItem 
     Push = .Item(.Count) 
    End With 

End Function 
Public Sub init() 
    Set pStack = New Collection 
End Sub 

टेस्ट यह

Option Explicit 
Sub test() 
    Dim cs As New cStack 
    Dim i As Long 
    Set cs = New cStack 
    With cs 
     .init 

     For i = 1 To 10 
      Debug.Print CStr(.Push(i)) 
     Next i 

     For i = 1 To 10 
      Debug.Print CStr(.Pop) 
     Next i 
    End With 
End Sub 

ब्रूस

+1

पर एक नज़र डालेंगे stackoverflow में आपका स्वागत है! कुछ कोड प्रदान करने के लिए +1 और दिखा रहा है कि यह कितना आसान हो सकता है। कुछ चेतावनी: 1) परेशान वीबीए 'सेट' सिंटैक्स की वजह से ऑब्जेक्ट्स शामिल होने पर आपके 'पुश' और 'पॉप' रूटीन में मान वापस करने के लिए '=' का उपयोग करना विफल हो जाएगा। इस उत्तर का अंत देखें: http://stackoverflow.com/questions/4716382/excel-select-case/4719706#4719706 2) ध्यान रखें कि संग्रह में अनुक्रमण करना समय के लिए ओ (एन) है। Http://stackoverflow.com/questions/4827963/what-is-the-difference-between-the-time-complexity-of-these-two-ways-of-using-loo/4830157#4830157 देखें – jtolle

1

मैं इन संरचनाओं के लिए किसी भी बाहरी VBA पुस्तकालयों में से पता नहीं है पता है। मेरी प्रक्रिया-कॉल स्टैक के लिए मैं बस पुश और पॉप विधियों के साथ एक वैश्विक सरणी और सरणी सूचक का उपयोग करता हूं।

1

ब्रूस मैककिनी एक ढेर के लिए प्रदान किया गया कोड सूची, और वेक्टर इस पुस्तक में (! यह VB5() था, लेकिन है कि शायद ज्यादा बात नहीं करता है):

http://www.amazon.com/Hardcore-Visual-Basic-Bruce-McKinney/dp/1572314222

(यह हो चुका है प्रिंट, लेकिन इस्तेमाल किया प्रतियां सस्ता कर रहे हैं)

स्रोत कोड यहाँ उपलब्ध हो गया लगता है:।

http://vb.mvps.org/hardweb/mckinney2a.htm#2

(सीए वेट - मैंने कभी भी अपने किसी भी कोड का उपयोग नहीं किया है, लेकिन मुझे पता है कि वह एक बहुत ही सम्मानित, लंबे समय तक वीबी विशेषज्ञ है, और उसकी पुस्तक को लंबे समय तक एमएसडीएन पर शामिल किया गया था।)

मुझे यकीन है कि वहां भी हैं इन चीजों के लिए इंटरनेट के चारों ओर तैरने के लिए कई अलग-अलग कार्यान्वयन, लेकिन मुझे नहीं पता कि उनमें से कोई भी व्यापक रूप से किसी के द्वारा उपयोग किया जाता है लेकिन उनके लेखकों द्वारा।

बेशक, इस सामान में से कोई भी अपने कोड को लिखना मुश्किल नहीं है, यह देखते हुए कि वीबीए आकार बदलने योग्य सरणी (वेक्टर के लिए सबसे अधिक तरीका) का समर्थन करता है और एक अंतर्निहित संग्रह वर्ग प्रदान करता है (जिस तरह से अधिकांश एक सूचि)। एक स्टैक के लिए चार्ल्स विलियम का जवाब आपको आवश्यक सभी जानकारी के बारे में है। बस एक सरणी या संग्रह के चारों ओर अपना खुद का रैपर प्रदान करें, लेकिन अंदर कोड अपेक्षाकृत मामूली हो सकता है।

हैशटेबल के लिए, एमएस स्क्रिप्टिंग रनटाइम में एक डिक्शनरी क्लास शामिल है जो मूल रूप से एक है। देखें:

Hash Table/Associative Array in VBA

+1

मैं कहना चाहिए कि मैककिनी के कोड काफी "तुच्छ" नहीं है। वह अपने संग्रह, इत्यादि के लिए इटरेटर कक्षाएं भी प्रदान करता है। – jtolle

+0

बहुत बहुत धन्यवाद, – BlackLabrador

0

आप System.Collections में वर्ग ढेर उपयोग कर सकते हैं के रूप में आप कतार और दूसरों का उपयोग कर सकते हैं। दस्तावेज़ीकरण के लिए बस vb.net ढेर के लिए खोजें। मैंने सभी विधियों का प्रयास नहीं किया है (उदाहरण के लिए Getenumerator - मुझे नहीं पता कि वीएबी में संभवतः, अगर पुनरावर्तक का उपयोग कैसे करें)। एक ढेर या कतार का उपयोग करके आपको कुछ अच्छे लाभ मिलते हैं, आमतौर पर वीबीए में इतना आसान नहीं होता है। आप

anArray = myStack.ToArray 

भले ही स्टैक खाली हो (आकार 0 से -1 की सरणी देता है) का उपयोग कर सकते हैं।

कस्टम संग्रह ऑब्जेक्ट का उपयोग करके, यह इसकी सादगी के कारण बहुत तेज़ काम करता है और आसानी से फिर से लिखा जा सकता है (उदाहरण के लिए केवल दृढ़ता से टाइप किए गए varibles को संभालने के लिए)। आप खाली ढेर के लिए एक चेक बनाना चाहते हो सकता है। यदि आप खाली स्टैक पर पॉप का उपयोग करने का प्रयास करते हैं, तो वीबीए सभी नल-ऑब्जेक्ट्स के रूप में इसे गहन रूप से संभाल नहीं पाएगा।मैंने पाया इसे और अधिक उचित उपयोग करने के लिए:

If myStack.Count > 0 Then 

समारोह से ढेर का उपयोग कर, बजाय clsStack.Pop में पाक की। यदि आप इसे कक्षा में सेंकते हैं, तो पॉप पर कॉल चुने गए प्रकार का मूल्य वापस कर सकता है - बेशक आप खाली मूल्यों को संभालने के लिए इसका उपयोग कर सकते हैं, लेकिन आपको इस तरह से अधिक दुःख मिलता है।

उपयोग का एक उदाहरण:

Private Sub TestStack() 
    Dim i as long 
    Dim myStack as clsStack 

    Set myStack = New clsStack 
    For i = 1 to 2 
     myStack.Push i 
    Next 

    For i = 1 to 3 
     If myStack.Count > 0 Then 
      Debug.Print myStack.Pop 
     Else 
      Debug.Print "Stack is empty" 
     End If 
    Next 

    Set myStack = Nothing 
End Sub 

एक LIFO-ढेर का उपयोग करना अत्यंत उपयोगी हो सकता है!

कक्षा clsStack

Dim pStack as Object 
Private Sub Class_Initialize() 
    set pStack = CreateObject("System.Collections.Stack") 
End Sub 
Public Function Push(Value as Variant) 
    pStack.Push Value 
End Function 
Public Function Pop() As Variant 
    Pop = pStack.Pop 
End Function 
Public Function Count() as long 
    Count = pstack.Count 
End Function 
Public Function ToArray() As Variant() 
    ToArray = pStack.ToArray() 
End Function 
Public Function GetHashCode() As Integer 
    GetHashCode = pStack.GetHashCode 
End Function 
Public Function Clear() 
    pStack.Clear 
End Function 
Private Sub Class_terminate() 
    If (Not pStack Is Nothing) Then 
     pStack.Clear 
    End If 
    Set pStack = Nothing 
End Sub