スタックとキューの面接問題(C言語版)
3436 ワード
1.出入桟の正当性の判断
https://blog.csdn.net/Payshent/article/details/69951411
2.2つのスタックを使用して1つのキューを実現
思想:1.スタック1内のすべてのデータはスタック2に弾き出される(スタック2は空のスタックである)
2.スタック2からすべてのデータをポップアップすると、キューの効果が得られます.
(デフォルトの圧送データはキュー1に圧送され、キュー2からデータが出力される)
3.2つのキューを使用して1つのスタックを実装
思想:1.まずキュー1の要素をキュー2に押し込み、キュー1に要素が1つしか残っていないので、残りの要素をポップアップします.
2.さらにキュー2の要素をキュー1に押し込み、最後の要素を残してポップアップ
3.キュー1に要素がないまで、上記の手順を繰り返します.
(途中で要素を押し込む必要がある場合は、空でないキューに押し込みます)
4.1つの配列で2つのスタックを実現
https://blog.csdn.net/zw_1510/article/details/51644230
https://blog.csdn.net/Payshent/article/details/69951411
2.2つのスタックを使用して1つのキューを実現
思想:1.スタック1内のすべてのデータはスタック2に弾き出される(スタック2は空のスタックである)
2.スタック2からすべてのデータをポップアップすると、キューの効果が得られます.
(デフォルトの圧送データはキュー1に圧送され、キュー2からデータが出力される)
typedef struct Stack
{
DataType _array[MAX_SIZE]; //
DataType top; //
int size; //
}Stack;
void StackInit(Stack* p)
{
p->size = 0;
p->top = -1;
}
void StackPush(Stack* p,DataType x)
{
if (p->size < MAX_SIZE)
{
p->_array[++p->top] = x;
p->size++;
}
else
{
printf("
");
}
}
DataType StackPop(Stack* p)
{
assert(p);
p->top--;
p->size--;
return p->_array[p->top + 1];
}
void test1(Stack* s,Stack* s1)
{
if (StackEmpty(s1) == 0) // s1
{
while (s->top >= 0)
{
s1->_array[++s1->top] = StackPop(s); //s , s1
s1->size++;
}
while (s1->top >= 0)
{
printf("%d ", s1->_array[s1->top--]); // s1
}
printf("
");
}
else
{
printf("%d ", s1->_array[s1->top--]);
}
}
3.2つのキューを使用して1つのスタックを実装
思想:1.まずキュー1の要素をキュー2に押し込み、キュー1に要素が1つしか残っていないので、残りの要素をポップアップします.
2.さらにキュー2の要素をキュー1に押し込み、最後の要素を残してポップアップ
3.キュー1に要素がないまで、上記の手順を繰り返します.
(途中で要素を押し込む必要がある場合は、空でないキューに押し込みます)
typedef struct QueueNode
{
DataType data;
struct QueueNode* _next;
}QueueNode;
typedef struct Queue
{
QueueNode* _head;
QueueNode* _tail;
}Queue;
Queue.c
void QueueInit(Queue* p)
{
p->_head = p->_tail = NULL;
}
QueueNode* BuyNode(DataType x)
{
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
assert(newNode);
newNode->data = x;
newNode->_next = NULL;
return newNode;
}
void QueuePush(Queue* p, DataType x)
{
if (p->_head == NULL)
p->_head = p->_tail = BuyNode(x);
else
{
p->_tail->_next = BuyNode(x);
p->_tail = p->_tail->_next;
}
}
QueueNode* QueuePop(Queue* p)
{
assert(p);
QueueNode* flag = p->_head;
p->_head = p->_head->_next;
return flag;
}
void QueueDestory(Queue* p)
{
while (p->_head)
{
QueueNode* del = p->_head;
p->_head = p->_head->_next;
free(del);
}
}
void test1(Queue* p, Queue* p1)
{
while (p->_head)
{
while (p->_head != p->_tail) //
{
QueuePush(p1, QueuePop(p)->data); // p1
}
printf("%d ", QueuePop(p)->data);
while (p1->_head)
{
QueuePush(p, QueuePop(p1)->data); // p1 p
}
}
printf("
");
}
4.1つの配列で2つのスタックを実現
https://blog.csdn.net/zw_1510/article/details/51644230
void ShareStacktest3() //
{
DataType arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Stack s1;
Stack s2;
int i = 0;
int j = sizeof(arr) / sizeof(arr[0]) - 1;
int capacity = j + 1;
StackInit(&s1);
StackInit(&s2);
while (s1.size < 2)
{
if (s1.size < MAX_SIZE)
{
StackPush(&s1, arr[i]);
i++;
}
else
{
printf(" 1
");
break;
}
}
Print(&s1);
printf("
");
while (s2.size < 7)
{
if (s2.size < MAX_SIZE)
{
StackPush(&s2, arr[j]);
j--;
}
else
{
printf(" 2 :
");
break;
}
}
Print(&s2);
printf("
");
}