数学建模社区-数学中国
标题:
matlab栈工具箱
[打印本页]
作者:
hbhzwj
时间:
2008-9-18 08:54
标题:
matlab栈工具箱
matlab也是可以实现常用的数据结构的,这个是我找到实现栈结构的matlab代码
- j- G6 H! S+ f3 }7 j- W* O5 Y U
function q=comein(p,varargin)
, V! O1 w7 c/ h6 b, s
% @QUEUE/COMEIN a variable comes to the end of a queue.
( Z+ ~* D' }( S a3 ]0 J P1 G
% 调用格式
/ e$ E/ n5 r) i2 V4 m
% comein(p,a,b,...) 使输入宗量 a,b 等排在 p 之后形成新队列,
: l9 A& M2 \# p' d! I# \
% 其名沿用 p 位置上的输入队列名 .
6 _5 k7 d9 o3 R$ `
% q=comein(p,a,b,...) 使输入宗量 a,b 等排在 p 之后形成新队列 q .
: f% N- b! i+ v$ G! U* `! v4 d
if nargin<2 error( 'comein needs at least two arguments.' ); end ;
6 p* F5 L' h0 B- y0 w; Y1 y
if ~isa(p, 'queue' ) error([inputname(1), ' is not a queue' ]); end ;
9 h1 |, U# H0 H8 d* `
q0=p;
0 ?! o5 u" f: J9 d8 M9 w
qzzy=class(p); % 获取第一输入宗量的类别字符串 <10>
9 y! t" r& v% x: K
for i=1:length(varargin)
0 y) i' l. {0 ]# a. e! r: W& t
temp=varargin{i};
9 y7 B! Q: z% q5 `- M
s=eval([qzzy, '(temp)' ]); % 使后来元素成为与第一输入宗量相同的类别 <13>
6 o4 B5 W2 N5 P
s.name=inputname(i+1);
. B5 ?. i! q$ z2 ?9 W- ?
if isempty(s.name) % 假如某输入宗量本身无名称
8 N: f/ c4 j, R1 @7 O$ ]
s.name=[ '(' class(temp) ')' ]; % 则把它的类别名作为名称使用
8 F) r# O0 m7 g- l* |$ g
end
! Q) `8 ]+ n @6 ?8 V9 }
: W7 }1 X8 X/ a, H/ @' G
if isempty(q0) % 假如前队列是“空”队列
1 Q2 s7 O0 m! f, P' C" j$ Z- J
q0=s; % 则直接进入队列
! e N1 Z. U3 p" h& T
else % 假如前队列非“空”
) P: P0 |3 T$ P7 E
q0=[q0 s]; % 则新变量排在队尾
. s' @6 M4 D* M
end
/ t# E# b, h/ _) D% t8 i- v
end
6 v g2 i4 E( c8 {' D4 Q! c9 R
& }1 U0 A8 X6 w6 ~. ^" z
if nargout==0; % 假如没有输出宗量
/ P6 A6 W7 p! O: V! Y8 D
assignin( 'caller' ,inputname(1),q0); % 新队列沿用第一个输入队列名
* ~7 j6 A8 @( D9 ]& Z
evalin( 'caller' ,inputname(1));
* K* ]- |6 x6 @) A* H7 m/ _
else % 假如有输入输出宗量
3 R' y& C! k6 X
q=q0; % 新队列名为 q
5 Y; W$ z8 q+ n* W2 N
end
8 i$ z- J2 n3 J, o/ E9 I0 z/ ~
# v/ s- N1 i# Q+ z" d
; F* v: u* h7 ]* P2 X" V
function display(q,ki,kj)
: S! |' ]$ V+ Q' w: b" F7 k& w. m
%QUEUE/DISPLAY command window display of a queue object.
9 D4 S, ~# a+ ]' R9 R
% 调用格式
) W7 u+ F \, M4 o% W4 J' Q/ j
% display(q) 笼统显示整个队列
; c3 k1 ]- e" e2 X) U2 s$ T c
% display(q,ki) 单下标法显示具体队列元素的内容
# T# u! _" c. Y& s
% display(q,ki,kj) 双下标法显示具体队列元素的内容
, ]7 `2 Y( y8 S
if nargin==0;error( ' 缺少输入宗量,即被显示对象 ! ' ); end
# n+ t- |% k% E7 a
switch nargin
% e: v( [4 G+ q/ V" J7 P! E* w, F
case 1 % 显示整个队列
6 ^5 x( `4 p7 d1 Z' d/ U
[m,n]=size(q);
3 Y7 R5 f' ?9 d8 c
vname=inputname(1); % 被显示对象 q 的名称
8 `) Z7 u/ T# n3 K
if isempty(vname) % 显示对象若无名称
# k, h" t9 S6 a. x4 l' C* J
fprintf( 'ans=\n' ); % 按 MATLAB教程: 惯例,屏幕显示 ans 缺省名
9 i/ x! |! K! g8 H5 |, _
elseif fprintf( '%s=\n' ,vname); % 对象有名称时,则屏幕以字符串形式显示名称
% _6 U N* G# \( v) X# O' Q
end ;
]! R% [2 B: l' {* Q8 n" t
: a; ~1 R' [" |8 Z7 D# v/ F
if isempty(q) % 假如被显示对象为“空”
5 o, F' F" I5 ^$ q I1 B
fprintf( ' [ empty ' ) %<17>
/ c# w+ J5 a$ K; F& H, U: K" _
fprintf( '%s' ,class(q)) %<18>
: b( M. h9 D( @% O$ V" e" p B
fprintf( ' ]\n\n' ); %<19>
, ?# T% H5 P# c8 f' o6 d: Y$ y9 ~& |
elseif m*n==1; % 被显示对象今包含一个“元素”时
: d C9 s, X* F1 M0 ^
fprintf( ' %s: ' ,q.name); % 屏幕先以字符串形式显示所存放对象的名称
- W& \; [; j/ D$ J5 `" |, W
disp(q.value); % 紧接着,不换行,显示所存放对象的内容
5 i; m4 v8 Z/ S; q# B
fprintf( '\n' );
, y& ]3 S$ y6 g& t5 j0 j
else % 被显示对象今包含多个“元素”时
) |9 N0 y( m/ I6 p
fprintf( ' [ %d*%d ' ,m,n) % 以下 3 条指令只显示队列“元素”排列 <25>
1 [5 z0 N1 t" t3 ^
fprintf( '%s' ,class(q)) %<26>
8 V! N) f) e9 p) A: N6 N
fprintf( ' ]\n\n' ); %<27>
: T$ d, U( W9 F3 J( `- L
end
! g. a: `7 D' `
( j/ [) a' Y6 q5 r7 {' M
case 2 % 单下标法显示具体队列元素的内容
1 i& S. M- U8 S! ?
disp([ 'The content of ' ,inputname(1), '(' ,int2str(ki), ')' ])
* V5 \7 X, g6 O: Y) \, r
disp([ 'is a ''' ,class(q(ki).value), ''' object' ])
! F: p# b. S% h$ `
fprintf( ' %s=\n' ,q(ki).name);
- k5 A$ }% p, ^7 Z. T( k7 _6 [
disp(q(ki).value);
8 j) x! o7 O' n" _3 o5 d$ }' k
fprintf( '/n' );
8 l7 T4 W' s7 |! L4 P b& M$ K7 F/ V
case 3 % 双下标法显示具体队列元素的内容
. H5 E, k. z6 T5 G7 B
disp([ 'The content of ' ,inputname(1), '(' ,int2str(ki), ',' ,int2str(kj), ')' ])
" \: V: {: ?7 i( Y
disp([ 'is a ''' ,class(q(ki,kj).value), ''' object' ])
6 @' |4 G! v: i. G: V/ U* [( ~) g& E
fprintf( ' %s=\n' ,q(ki,kj).name);
0 m0 n; }/ ~! Z( E
disp(q(ki,kj).value);
7 G- J. ]& u. r' S) z$ F# u
fprintf( '\n' );
4 {" h q7 [" j
end
& H8 f- H$ C: H6 \
/ T* J1 A) o2 D, o
# i7 v+ O0 a% T1 m! T1 g! h5 q, H
function [n,v,q]=goout(p)
& w6 H5 K. t3 c# N$ p' ^: j2 w4 w
% @QUEUE/GOOUT removes the first(the front) element from a queue.
$ m: t* l: J* g+ H# v" |
% 调用格式
* O# u2 D2 V7 k. Y( ~4 I
% goout(p) 从队列 p 中的第一个元素离队 .
( Y- N" T: P$ l( f
% v=goout(p) v 是从 p 队列中移出的那第一个元素的“值”
. A$ j3 B; y% [9 ?; ^4 o9 s1 ~. M* G
% [n,v]=goout(p) n,v 分别 是从 p 队列中移出的那第一个元素的“名称”和“值”
2 g0 o, ` g) y; L0 |1 ]$ H
% [n,v,q]=goout(p) n,v 分别 是从 p 队列中移出的那第一个元素的“名称”和“值”
4 {( C Y8 ?4 X2 u
% q 是被移去第一个元素后的新队列
: D! X$ r5 U" m1 }
if nargin==0 ;error( 'No queue specifide.' ); end ;
4 C$ J0 E. |4 L9 b( J0 \
if nargout>3;error( 'Too many output arguments.' ); end ;
+ A' e9 W& b; i6 Z; Y9 U6 Q" G
if nargin>1 error( 'Too many input arguments.' ); end ;
0 V" n& U" |6 p/ v) U+ o. a
if ~isa(p, 'queue' );error([inputname(1), ' is not a queue.' ]); end ;
5 }5 z* U. G+ }" y. e* e3 U
if isempty(p)
, z: A7 L* B0 K8 f& I: j; i% S" i: F
q1=p;
- {% n6 D' l# G( [
else
. u8 o0 n3 v- m9 W- C4 c! a) @
[m,n]=size(p);
+ A! p" ]% _ [
v1=p(1).value;n1=p(1).name;
4 u4 U! n$ b k7 T/ e
if m*n==1
2 P7 ^7 U2 A& M3 w2 R3 E' `* m
q1=queue;
9 o# m6 t/ B& v$ A4 G& m9 j9 w1 L: q
else
- U. G4 P1 b1 T% v6 D1 _
q1=p(2:end);
6 M. V; L6 a; r; N9 l$ D* }5 d# E
end
% A* A. K" C1 V$ I. [
end
4 m& G, N' c6 o. g9 S; t: U L, H
1 Q, c# w, R6 N1 G# c" W
if nargout<3;
; R. [# g! J/ |& e
assignin( 'caller' ,inputname(1),q1);
5 ]% h/ @ v8 u9 y$ |; O; G1 Q
end ;
0 H- l& l1 y* r8 Z
# K( w0 y9 G/ r# x' B4 `( Q
if nargout==0,
7 M8 T$ }9 B7 V2 G4 `
evalin( 'caller' ,inputname(1));
4 D6 k& y! d# `$ ^8 V3 U( Q
end
, [! _8 x( [( k1 x+ M8 E
if nargout>=1;v=v1; end ;
9 i5 j* A, }" x' u/ I
if nargout>=2;n=n1; end ;
; J: A4 y7 S+ w, R
if nargout==3;q=q1; end ;
7 ^, r# x4 f' I; B! N
) [9 T# P1 l4 U
/ i' f1 S+ W0 s+ ^) J% n
function f=isempty(q)
& u, _6 x9 v: ?5 Z' N1 r$ K/ l
%@QUEUE/ISEMPTY True for an empty queue object.
" Y! N! X' u) v' [+ q0 S, i1 T
f=0;
, \1 R, h2 T9 s; {- S4 z E" W
[m,n]=size(q);
' W9 a% ~8 _% f' c: d1 f8 i* K+ Y
if m*n==1;
: p2 Z. W* T+ }/ Y& ?
if isempty(q.value) & isempty(q.name) %<6>
# p, i5 f" M. V
f=1;
4 g1 V/ N( J, K/ l# y
end ;
- ]$ I8 M5 z) p5 u) C3 E, e. c
end ;
3 x3 ~1 g6 H5 Z' D
( G/ X' {. P9 f) e$ v* C" g
7 h1 I+ q( ?; Q1 G. H+ d
" ?0 I8 I+ o2 z3 g. Y" V
function q=queue(v)
1 [$ L1 _4 X" B C0 Q# X. \) H
%@QUEUE/QUEUE queue class constructor function
' v+ _7 T4 V2 q2 Y$ `" S
% 调用格式
4 t! C7 w9 E6 {/ {$ x/ u
% q=queue 创建一个 " 空 " 队列对象 .
; r3 ^6 q% i4 O' n/ R; p: b
% q=queue(v) 创建包含变量 v 的队列对象。
U4 k) n* ]. x( g& b4 y) Q
superiorto( 'double', 'struct' , 'cell' , 'char' , 'inline' , 'sym' );
. a/ y* m) }: q" s! O, K m* e4 }
% 使 queue 对象具有最高优先级 <6>
7 t5 j" c$ c4 |$ g
if nargin>1;error( 'Too many arguments.' ); end ;
7 W% Q4 d; O$ g5 V% ~
if nargin==0 % 没有输入宗量情况
. ~% b( @4 @" C: O1 w$ ^# ~6 l
q.value=[]; % value 域被赋“空阵”
' Z7 M( q5 U& {9 B% k9 I
q.name= '' ; % name 域不给任何字符
0 e4 K5 d: ]8 c
q=class(q, 'queue' ); % 给变量 q 挂上 queue 标签
3 R- z$ L3 T i2 a4 z# x
elseif isa(v, 'queue' ); % 输入宗量是同类对象情况
7 h8 t1 S: n8 ?$ D9 I
q=v; % 直接把输入量赋给 q
/ |( d" u+ Y/ O3 q% G
else % 非同类输入宗量情况
( U3 j; g8 ?$ U. d+ Q# x; @' T
q.value=v; % 在 value 域中放置输入对象 v 的内容
2 E& W- w' R7 X" b: Q
q.name=inputname(1); % 在 name 域中放置输入对象名 v 字符
8 n$ S+ t/ Z j. d$ z3 O
3 Y5 v* H6 S0 I, k# E" v1 y2 M
if isempty(q.name) % 假如输入量无名
( u; r( u( r: }
q.name=[ '(' class(v) ')' ]; % 就采用 v 本身的类名
( g# q+ C: a9 _7 t0 ` o
end
8 ^; W; V7 O+ ~: K7 N
1 x" g) O. T$ k3 L
q=class(q, 'queue' ); % 给变量 q 挂上 queue 标签 <20>
% g; T5 l( ~. T( h# ~, t
end
0 [: D0 `+ w& G4 y# b1 L
; w) a7 H% k- m) } T
[
本帖最后由 hbhzwj 于 2008-9-18 08:57 编辑
]
作者:
xulei1600
时间:
2008-9-18 16:20
没用过Matlab实现栈操作
" J; C" j/ r2 I' a
0 v: B/ S. @7 j& L" o' i- E
都是用C++实现的
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5