【資料結構】棧的儲存結構(二)雙端棧
阿新 • • 發佈:2018-12-13
雙端棧
- 雙端棧是為了更有效的利用棧的空間而產生的。
- 雙端棧是一種特殊的順序棧。
- 雙端棧適用於一組互補的資料。
- 雙端棧兩端為底,2個整形表示棧頂指標。
程式碼收穫
- 主要還是弄清雙端棧的結構。
棧的歸檔
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
//雙端棧需要有2個棧頂指標 底在2端
typedef struct stack{
char data[MAXSIZE];
int top[2];
}stack,*stackp;
//這樣一個底在0處,一個底在maxsize-1處
//初始化需要把2個top至於2底端
void InitialStack(stackp *ST){
*ST=(stackp)malloc(sizeof(stack));
(*ST)->top[0]=-1;
(*ST)->top[1]=MAXSIZE;
}
//入棧 帶選擇
int PushStack(stackp ST){
printf("輸入需要插入0號棧或1號棧\n");
int num;
scanf("%d",&num);
getchar();
if(num==0){
printf("輸入要插入的元素,$結束\n");
int flag1 = 1;
while(flag1){
char c1;
c1 = getchar();
if(c1!='$'){
if((ST->top[0])+1==ST->top[1]){//指標位置重合表示棧滿
printf("棧滿\n");
return 1;
}else{
ST->data[ST->top[0]+1]=c1;
ST->top[0]++;
}
}else{
flag1 =0;
}
}getchar();
}else if(num==1){
printf("輸入要插入的元素,$結束\n");
int flag2 = 1;
while(flag2){
char c2;
c2 =getchar();
if(c2!='$'){
if((ST->top[1])-1==ST->top[0]){//指標位置重合表示棧滿
printf("棧滿\n");
return 1;
}else{
ST->data[ST->top[1]-1]=c2;
ST->top[1]--;
}
}else{
flag2 =0;
}
}getchar();
}return 0;
}
void PrintStack(stackp ST){
printf("雙端棧一端為\n");
int i = 0;
for(;i<=ST->top[0];i++){
printf("%c",ST->data[i]);
}
printf("\n另一端為\n");
int p=MAXSIZE-1;
for(;p>=ST->top[1];p--){
printf("%c",ST->data[p]);
}
}
int PopStack(stackp ST){
printf("選擇棧0和1哪個出棧?\n");
int num;
scanf("%d",&num);
getchar();
if(num==0){
if(ST->top[0]==-1){
printf("已經空了\n");
}else{
ST->top[0]--;
}
}else if(num==1){
if(ST->top[1]==MAXSIZE){
printf("已經空了\n");
}else{
ST->top[1]++;
}
}PrintStack(ST);
}
void main(){
stackp ST;
InitialStack(&ST);
PushStack(ST);
PrintStack(ST);
PushStack(ST);
PrintStack(ST);
PopStack(ST);
}