首先是兩者的定義:
棧也稱為堆棧,是一種線性表。
棧的特性: 最先放入棧中的內容最后被拿出來,最后放入棧中的內容最先被拿出來, 被稱為先進后出、后進先出。
隊列也是一種特殊的線性表。不同於棧所服從的先進后出的原則,隊列的原則是先進先出。
隊列在隊頭做刪除操作,在隊尾做插入操作。
然后是兩者的異同點
不同點:
1.刪除數據元素的位置不同,棧的刪除操作在表尾進行,隊列的刪除操作在表頭進行。
2.隊列先進先出,棧先進后出。
3.順序棧能夠實現多棧空間共享,而順序隊列不能。
4.遍歷數據速度不同。
棧只能從頭部取數據,也就最先放入的需要遍歷整個棧最后才能取出來。
隊列則不同,它基於地址指針進行遍歷,而且可以從頭或尾部開始遍歷無需開辟臨時空間,速度要快的多。
相同點:
1.都是線性結構。
2.插入操作都是限定在表尾進行。
3.都可以通過順序結構和鏈式結構實現。
4.插入與刪除的時間復雜度與空間復雜度上兩者均相同。
再然后便是兩者的表示和操作的實現
棧表示和操作的實現:
#include <iostream>
#define MAXSIZE 100//基礎容量
using namespace std;
typedef struct
{
SElemType *top;//棧頂指針
SElemType *base;//棧底指針
int stacksize;//棧可用最大容量
}SqStack;
Status InitStack(SqStack &S)//初始化棧
{
S.base=new SElemType[MAXSIZE];
if(!s.base) exit(OVERFLOW);//內存分配失敗
S.top=s.base;
S.stacksize=MAXSIZE;
}
Status Push(SqStack &S,SElemType e)//把元素e壓入棧頂
{
if(S.top-S.base==S.stacksize) return ERROR;//棧滿
*S.top++=e;//棧頂指針+1
return OK;
}
Status Pop(SqStack &s,SElemType &e)//取出棧頂元素,並刪除棧頂
{
if(S.top==S.base)//top與base重合時,棧為空
return ERROR;
e=*--S.top;
return OK;
}
SElemType GetTop(SqStack S)
{
if(S.top!=S.base)
return *(S.top-1);
}
隊列表示和操作的實現:
#ifndef STATICQUEUE_H_INCLUDED
#define STATICQUEUE_H_INCLUDED
template<class T>
class StaticQueue
{
public:
StaticQueue();
StaticQueue(int size);
~StaticQueue();
void enqueue(T data);
T dequeue();
bool isEmpty();
bool isFull();
int count();
void display();
private:
int rear;
int front;
int size;
const static int DEFAULT;
T* queue;
};
這些在課本上都有,下面說說遇到的問題:
對於作業3,可以說是屢戰屢敗,屢敗屢戰了,先是一點思路都沒有,再到后來老師提示后有一點思路,但還是錯誤百出,再到后來參照書上的方法,還是錯誤,最后終於發現問題。話不多說,直接上代碼:
#include <iostream>
#define MAXSIZE 100//基礎容量
using namespace std;
typedef struct
{
SElemType *top;//棧頂指針
SElemType *base;//棧底指針
int stacksize;//棧可用最大容量
}SqStack;
Status InitStack(SqStack &S)//初始化棧
{
S.base=new SElemType[MAXSIZE];
if(!s.base) exit(OVERFLOW);//內存分配失敗
S.top=s.base;
S.stacksize=MAXSIZE;
}
Status Push(SqStack &S,SElemType e)//把元素e壓入棧頂
{
if(S.top-S.base==S.stacksize) return ERROR;//棧滿
*S.top++=e;//棧頂指針+1
return OK;
}
Status Pop(SqStack &s,SElemType &e)//取出棧頂元素,並刪除棧頂
{
if(S.top==S.base)//top與base重合時,棧為空
return ERROR;
e=*--S.top;
return OK;
}
SElemType GetTop(SqStack S)
{
if(S.top!=S.base)
return *(S.top-1);
}
Status Matching()
{
InitStack(s);
flag=1;
cin>>ch;
while(ch!='#'&&flag)
{
switch(ch)
{
case'{':
case'[':
case'(':
Push(S,ch);
break;
case')':
if(!StackEmpty(S)&& GetTop(s)=='(')
Pop(S,e);
else flog=0;
break;
case']':
if(!StackEmpty(S)&& GetTop(S)=='[')
Pop(S,e);
else flog=0;
break;
case'}':
if(!StackEmpty(S)&& GetTop(S)=='{')
Pop(S,e);
else flog=0;
break;
}
cin>>ch;
}
if(StackEmpty()&&flag)
cout<<"yes";
else cout<<"no";
}
這是錯誤的,無法輸入空格,雖然與書本上的一致,但並不完善
#include<iostream>
#include<string>
#include <stdio.h>
using namespace std;
struct initstack {
char *top = NULL;//定義棧底指針
char*base = NULL;//定義棧頂指針
int stacksize;//定義棧空間長度
}S;//創建top指針和base指針
void Initinitstack(initstack &S) {
S.base = new char [101];//為棧創建空間
S.top= S.base;//表示空棧
S.stacksize = 101;//定義順序棧長度
}//創建順序棧
void push(initstack &S,char str){
*S.top = str;//將字符存入棧中
++S.top;//棧頂指針地址加一
}//入棧函數
char pop(initstack &S) {
--S.top;//棧頂指針下移一位
char str = *S.top;//取棧頂字符
*S.top = 0;//刪除棧頂字符
return str;
}//出棧函數
bool matching() {
int flag = 1;string str;
getline(cin, str);//輸入字符串
if (str.size()> 100) return 0;//字符串長度不得超過100
int count = 0;//定義基數
while (str[count] != '\0'&&flag) {//若出現左括號,則入棧
if (str[count] == '(' || str[count] == '[' || str[count] == '{'){
if (S.top - S.base != S.stacksize) {//判斷棧滿
push(S, (char)str[count]);//進行入棧
}
}
if (str[count] == ')' || str[count] == ']' || str[count] == '}') {//若出現右括號,則取棧頂字符
char temp = 0;
if (S.base == S.top) flag = 0;//若出現右括號並且棧空的情況,說明不匹配
else temp = pop(S);//棧頂元素進行出棧
switch (temp){//利用switch語句進行判斷
case'(':
if (str[count] != ')') flag = 0;//匹配不成功
break;
case'[':
if (str[count] != ']') flag = 0;//匹配不成功
break;
case'{':
if (str[count] != '}') flag = 0;//匹配不成功
break;
default:
break;
}
}
++count;
}
if (S.top!=S.base) flag = 0;//最后判斷棧空
return flag;//返回flag的情況
}
int main(){
Initinitstack(S);//創建順序棧
if (matching()) cout << "yes";//調用匹配函數
else cout << "no";
return 0;
}
這個達到了題目要求,利用string函數代替了直接輸入,解決了無法輸入空格問題。
總之,第三章比起前面的內容,明顯更難,但我們不能放棄,一定要堅持!加油!