#pragma once
#include
#include
#include
#include
using
namespace
std;
/*棧的典型應用:
1)有明確演算法解決乙個問題,但是問題的解卻以線性序列的形式給出。
2)無論是遞迴還是迭代實現,該線性序列都是以逆序計算輸出的。
3)輸入輸出規模不確定,難以事先確定盛放輸出資料的容器的大小。
*/template
class stack
void clear()
bool empty()const
t& top()const;//取頂:直接返回向量的末元素
void push(t const &e);//入棧:等效於將新元素作為向量的未元素插入
bool pop(t &e);//出棧:等效於刪除向量末元素
bool find(const t& e)const;
template
friend ostream& operator
<<(ostream &os,stack&v);
};template
void stack::copyfrom(t const *a, int lo, int hi)
}template
void stack::expand()
template
void stack::shrink()
template
stack::stack(int s = 0, int v = 0)
template
stack::stack(t const *a, int n)
template
stack::stack(t const *a, rank lo, rank hi)
template
stack::stack(stackconst &v)
template
stack::stack(stackconst &v, rank lo, rank hi)
template
void stack::push(t const &e)
template
bool stack::pop(t &e)
template
t& stack::top()const
template
bool stack::find(const t& e)const
}return
false;
}template
ostream& operator
<<(ostream &os, stack&v)
os << "]";
return os;
}//典型應用
class stackexample
; queen(const queen &q)
bool
operator == (const queen &q)const
bool
operator != (const queen &q)const
friend ostream& operator
<<(ostream &os, queen &v)
};public:
template
static
void convert(stack&s, int n, int base); //1.將十進位制數n轉換為base進製
template
static
bool check(stack&s, string world);//2.分隔符匹配
static
float getexpressionresult(string
exp, string &rpn);//3.對表示式exp求值,並轉換為逆波蘭式rpn
static
void placequeens(int n);//n皇后問題
};template
void stackexample::convert(stack&s, int n, int base)
; if (n > 0)
/*while (n)//非遞迴版
*/}template
bool stackexample::check(stack&s, string world)
': if (s.pop(c) && (c == '
i++;
}return s.empty();
}template
d stackexample::calcu(t op, d d1, d d2)
return r;
}template
//o1:棧頂,o2:當前,返回棧頂 op 當前
t stackexample::comoptr(t st, t cur)
else
if (st == '*' || st == '/')
else
if (st == '(')
else
if (st == ')')
return c;
}template
bool stackexample::readnumber(const
string &exp, int pos, stack&s)
for (int e = pos; e < exp.size(); e++)
}return
false;
}float stackexample::getexpressionresult(string
exp,string &rpn)
else
//若當前字元為運算子
else
}break;
default:exit(-1);}}
dx++;
}if (!opnd.empty() && !optr.empty())
opnd.pop(v);
return v;}/*
很多應用問題的解,在形式上都可看作若干元素按特定次序構成的乙個序列,
構成這個序列的排列組合有很多個,如果用蠻力策略,則必然無法將執行時間控制在多項式的範圍內。
技巧:根據候選解的某些區域性特徵,以候選解子集為單位批量的刪除,搜尋空間一般呈樹狀結構,
而被排除的候選解往往隸屬於同一分支,這個技巧稱為剪枝。與只對應的演算法多呈現如下模式:
從0開始,嘗試逐步增加候選解的長度,這一過程是在成批地考查具有特定字首的所有候選解,
這種從長度上逐步向目標解靠近的嘗試,稱作試探。
8皇后問題的座標系:
---------y丨丨
丨 x*/void stackexample::placequeens(int n)
else
//試探下一列
else
}} while (solu.size()//輸出結果序列
cout
<< solu << endl;
}
資料結構3 棧
2 2 鏈式棧儲存結構與基本運算 3 棧的應用 棧 stack 限定在棧頂 表尾 進行插入 入棧 和刪除 出棧 的線性表。基操作的特性是先進後出,又稱為 後進先出 last in first out,lifo 的線性表。根據棧的設計儲存結構的不同,一般分也順序棧和鏈式棧,對應的基本運算操作也有所不同...
資料結構(3) 棧
0.目錄 1.線性表 陣列 2.線性表 單向鍊錶 3.棧棧是一種比較常見的資料結構,是一種較為特殊的線性表。對於棧來說,插入 刪除 訪問元素只能在棧頂進行。對棧的基本操作有push 進棧 pop 出棧 和peek 查詢棧頂 基於這種特性,棧又叫做lifo last in first out 表,即後...
資料結構3 棧
2 2 鏈式棧儲存結構與基本運算 3棧的應用 棧 stack 限定在棧頂 表尾 進行插入 入棧 和刪除 出棧 的線性表。基操作的特性是先進後出,又稱為後進先出 last in first out,lifo 的線性表。根據棧的設計儲存結構的不同,一般分也順序棧和鏈式棧,對應的基本運算操作也有所不同。棧...